ลิงก์สัญลักษณ์ไปยังเบ็ดในคอมไพล์


86

ฉันเขียน post-merge hook ที่กำหนดเองตอนนี้ฉันเพิ่มไดเร็กทอรี "hooks" ในโฟลเดอร์โปรเจ็กต์หลักของฉัน (เนื่องจาก git ไม่ติดตามการเปลี่ยนแปลงใน. git / hooks) บางแห่งฉันอ่านว่าฉันสามารถสร้างลิงก์สัญลักษณ์จาก hooks ได้ เป็น. git / hooks ดังนั้นฉันจึงไม่ต้องคัดลอกไฟล์จากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์หนึ่งทุกครั้งที่มีคนเปลี่ยนไฟล์ดังนั้นฉันจึงลอง:

ln -s -f hooks/post-merge .git/hooks/post-merge

แต่ดูเหมือนจะไม่ได้ผลความคิดใด ๆ ทำไม? "ln hooks / post-merge .git / hooks / post-merge" ใช้งานได้ดี แต่การสร้างฮาร์ดลิงก์จะเหมือนกับการ copyin ฉันเดาว่า ....


22
เนื่องจาก symlink ได้รับการแก้ไขโดยสัมพันธ์กับตำแหน่ง ลิงก์เชื่อมโยงใน.git/hooks/จุดนั้นจะhooks/post-mergeได้รับการแก้ไข.git/hooks/hooks/post-mergeซึ่งไม่มีอยู่จริง ln -s -f ../../hooks/post-merge .git/hooks/post-mergeคุณต้องการ หรือทำให้ชีวิตของคุณง่ายขึ้น: ln -s -f ../hooks .git/hooks. ปัญหาของคุณไม่มีส่วนเกี่ยวข้องกับคอมไพล์
Aristotle Pagaltzis

1
stackoverflow.com/questions/3462955/…และstackoverflow.com/questions/427207/… (และstackoverflow.com/questions/3703159/… ) ชี้ให้เห็นความจริงที่ว่า symlink สามารถทำงานได้
VonC

แก้ไขฉันถ้าฉันผิด แต่ยังต้องตั้งค่า Symlink ต่อเวิร์กสเตชัน สิ่งเดียวที่จะช่วยประหยัดนี้จะถูกคัดลอกไปรอบ ๆ .git/hooksด้วยตนเองหรือการเขียนคำสั่งอื่นที่สำเนาแฟ้มเบ็ดลงไปในการติดตาม
adi518

คำตอบ:


161

คุณเพิ่งใช้เส้นทางที่ไม่ถูกต้องควรเป็น:

ln -s -f ../../hooks/post-merge .git/hooks/post-merge

10
ฉันไม่เข้าใจว่าทำไมฉันต้องเพิ่มสองไดเรกทอรีเพื่อเชื่อมโยงทรัพยากรที่อยู่ในโฟลเดอร์ที่ฉันcdเข้าไป มันควรจะไม่ใช่ln -s ./hooks/เหรอ?
Droogans

45
นี้. เมื่อ git กำลังประเมิน symlink ดูเหมือนว่าจะใช้.git/hooksเป็นไดเร็กทอรีการทำงานดังนั้นพา ธ สัมพัทธ์ควรสัมพันธ์กับไดเร็กทอรีนั้น นี้เป็นตัวเองมากขึ้นถ้าคุณอธิบายแรกcdเข้า.git/hooksก่อนที่จะทำการ symlink และคิดออกทางญาติจากที่นั่น
Eliot

12
@Eliot ทั้งการสร้างหรือความละเอียดของ symlinks ไม่ได้รับผลกระทบจากไดเร็กทอรีการทำงาน สิ่งที่คุณให้lnจะถูกเก็บไว้เป็นเป้าหมายและได้รับการแก้ไขโดยสัมพันธ์กับตำแหน่งของลิงค์
JoóÁdám

2
@ JoóÁdámคุณพูดถูก ดังนั้นปัญหาที่นี่คือคำสั่งเดิมระบุเส้นทางสัมพัทธ์ที่ไม่ถูกต้อง ยังคงcdไอเอ็นจีเข้ามา.git/hooksก่อนที่จะทำการเชื่อมโยงจะช่วยให้คุณเขียนคำสั่งให้เป็นแล้วคุณสามารถเติมข้อความอัตโนมัติไปยังเส้นทางที่ถูกต้อง
Eliot

1
ทั้งหมดนี้ได้ผลสำหรับฉันในที่สุด prepare-commit-msgแต่ที่แตกต่างก็คือว่าฉันกำลังเชื่อมโยงไปของตัวเอง ปัญหาคือถ้าฉันแก้ไขข้อความคอมมิตโดยใช้นาโนแล้ว Ctl + X ออกเพื่อยกเลิกคอมไพล์ยังคงทำการคอมมิตต่อไปแทนที่จะยกเลิกเหมือนที่เคยทำก่อนที่ฉันจะทำการเปลี่ยนแปลงนี้ มีวิธีที่จะมีทางออกนาโนโดยไม่ทำให้การกระทำนี้เสร็จสมบูรณ์หรือไม่?
frakman1

15

ในขณะที่คุณสามารถใช้ลิงก์สัญลักษณ์คุณยังสามารถเปลี่ยนโฟลเดอร์ hooks สำหรับโปรเจ็กต์ของคุณได้ในการตั้งค่าคอมไพล์ของคุณด้วย:

git config core.hooksPath hooks/

ซึ่งเป็นค่าเริ่มต้นโดยค่าเริ่มต้นดังนั้นจะไม่ทำลาย git hooks สำหรับโครงการอื่น ๆ ของคุณ มันใช้ได้กับเบ็ดทั้งหมดในที่เก็บนี้ดังนั้นจึงมีประโยชน์อย่างยิ่งหากคุณมีเบ็ดมากกว่าหนึ่งตัว

หากคุณมี hooks ที่กำหนดเองอยู่แล้ว.git/hooks/ซึ่งคุณไม่ต้องการแบ่งปันกับทีมของคุณคุณสามารถเพิ่มใน hooks / และเพิ่ม.gitignoreเพื่อไม่ให้แชร์ได้


ดีมาก! เคล็ดลับที่มีประโยชน์ :) ดูเหมือนว่าจะพิสูจน์อนาคตได้ไกลกว่าการเชื่อมโยงสัญลักษณ์ทีละรายการ
jkp

2

การเปลี่ยนไดเร็กทอรีก่อนเชื่อมโยง

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge

ง่ายกว่านั้นอีกหลังจากcd:ln -s -f ../../hooks/post-merge
jamesdlin

0

การคำนวณเส้นทางทำได้โดยสัมพันธ์กับ symlink มาทำความเข้าใจโดยใช้ตัวอย่าง

ln -s path/to/file symlink/file

ที่นี่เส้นทางไปยังไฟล์ควรเป็นเส้นทางสัมพัทธ์จากเส้นทาง symlink
ระบบจะคำนวณเส้นทางไฟล์ตามความเป็นจริงsymlink/path/path/to/file
คำสั่งด้านบนควรเขียนใหม่เป็น

ln -s ../path/to/file symlink/path

โครงสร้างโฟลเดอร์

/ code
------ symlink / file
------ path / to / file


0

จากความคิดเห็นของ Michael Cihar นี่คือตัวอย่างของ bash script ที่ฉันเขียนขึ้นเพื่อสร้าง symlink สคริปต์นี้อยู่ใน git_hooks / dir ซึ่งอยู่ที่รูทโปรเจ็กต์ .git / โฟลเดอร์ของฉันอยู่ในระดับไดเร็กทอรีเดียวกันด้วย

#!/usr/bin/env bash

pwd=$(pwd);

# Script is designed to be ran from git_hooks/ dir
if [[ "$pwd" == *"git_hooks"* ]]; then

  files=$(ls | grep -v -e '.*\.');

   while read -r file; do

     ln -s ../../git_hooks/$file ../.git/hooks/
     echo "Linked $file -> ../.git/hooks/$file"

   done <<< "$files";

else

  echo "";
  echo "ERROR: ";
  echo "You must be within the git_hooks/ dir to run this command";
  exit 1;

fi

สคริปต์ของฉันต้องถูกรันจากภายในไดเร็กทอรี git_hooks / จริง คุณสามารถปรับเปลี่ยนให้ทำงานแตกต่างกันได้หากต้องการ

สคริปต์นี้จะเชื่อมโยงไฟล์ใด ๆ ที่ไม่ได้ต่อท้ายด้วยนามสกุลไฟล์ภายในไดเร็กทอรี git_hooks / ฉันมี README.txt ในไดเร็กทอรีนี้ + สคริปต์นี้ (ชื่อ symlink.sh) git hooks ที่แท้จริงทั้งหมดมีชื่อว่า 'pre-commit', 'pre-push' และอื่น ๆ ดังนั้นจึงมีการเชื่อมโยงกัน


-2

ทำไมไม่แค่ cp ./hooks/* .git / hooks /

สิ่งนี้ใช้ได้กับฉันใน Mac OS


15
เพราะI don't have to copy the file from one folder to the other every time someone changes
George Dimitriadis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.