สิ่งที่ดีที่สุดของฉันจะเป็นเชลล์สคริปต์ซึ่งแทนที่ symlink ด้วยสำเนาหรือมีวิธีบอก Git ให้ทำตาม symlinks อีกหรือไม่
PS: ฉันรู้ว่ามันไม่ปลอดภัยมาก แต่ฉันต้องการทำในบางกรณีเท่านั้น
สิ่งที่ดีที่สุดของฉันจะเป็นเชลล์สคริปต์ซึ่งแทนที่ symlink ด้วยสำเนาหรือมีวิธีบอก Git ให้ทำตาม symlinks อีกหรือไม่
PS: ฉันรู้ว่ามันไม่ปลอดภัยมาก แต่ฉันต้องการทำในบางกรณีเท่านั้น
คำตอบ:
หมายเหตุ:คำแนะนำนี้ล้าสมัยไปแล้วตามความคิดเห็นตั้งแต่ Git 1.6.1 Git เคยทำตัวแบบนี้และไม่ทำอีกต่อไป
Git ตามค่าเริ่มต้นพยายามจัดเก็บ symlink แทนที่จะติดตามพวกเขา (เพื่อความกะทัดรัดและโดยทั่วไปเป็นสิ่งที่ผู้คนต้องการ)
อย่างไรก็ตามฉันตั้งใจจัดการให้เพิ่มไฟล์เกิน symlink เมื่อ symlink เป็นไดเรกทอรี
เช่น:
/foo/
/foo/baz
/bar/foo --> /foo
/bar/foo/baz
จากการทำ
git add /bar/foo/baz
มันดูเหมือนว่าจะทำงานเมื่อฉันพยายาม ในขณะนั้นฉันไม่ต้องการพฤติกรรมดังกล่าวดังนั้นฉันจึงไม่สามารถให้ข้อมูลกับคุณได้
สิ่งที่ฉันทำเพื่อเพิ่มรับไฟล์ภายใน symlink ใน Git (ฉันไม่ได้ใช้ symlink แต่):
sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
ทำคำสั่งนี้ในไดเรกทอรีที่จัดการโดย Git TARGETDIRECTORY
จะต้องสร้างขึ้นก่อนที่SOURCEDIRECTORY
จะติดตั้งเข้าไป
มันใช้งานได้ดีบน Linux แต่ไม่ใช่ใน OS X! เคล็ดลับนั้นช่วยฉันด้วยการโค่นล้มเช่นกัน ฉันใช้มันเพื่อรวมไฟล์จากบัญชี Dropbox ซึ่งผู้ออกแบบเว็บทำหน้าที่ของเขา / เธอ
umount [mydir]
หากต้องการยกเลิกการนี้มีผลผูกพันใช้ (+1 สำหรับเคล็ดลับที่ยอดเยี่ยมของคุณ @ user252400)
ทำไมไม่สร้าง symlink แบบอื่น ๆ ล่ะ? ความหมายแทนที่จะเชื่อมโยงจากที่เก็บ Git ไปยังไดเรกทอรีแอปพลิเคชันเพียงเชื่อมโยงวิธีอื่น ๆ
ตัวอย่างเช่นสมมติว่าฉันกำลังติดตั้งแอปพลิเคชัน~/application
ที่ต้องใช้ไฟล์กำหนดค่าconfig.conf
:
config.conf
ไปยังที่เก็บ Git ของฉันตัวอย่างเช่นที่~/repos/application/config.conf
ฉันสำหรับตัวอย่างเช่นที่~/application
ln -s ~/repos/application/config.conf
วิธีนี้อาจไม่ได้ผลเสมอไป แต่มันก็ใช้ได้ดีสำหรับฉันจนถึงตอนนี้
ใช้ฮาร์ดลิงก์แทน สิ่งนี้แตกต่างจากลิงก์แบบนุ่ม (สัญลักษณ์) โปรแกรมทั้งหมดรวมถึงgit
จะถือว่าไฟล์เป็นไฟล์ปกติ โปรดทราบว่าเนื้อหาสามารถแก้ไขได้โดยการเปลี่ยนทั้งแหล่งที่มาหรือปลายทาง
หากคุณมีคอมไพล์และ Xcode ติดตั้งติดตั้ง Hardlink มันเป็นกล้องจุลทรรศน์เครื่องมือในการสร้างความเชื่อมโยงอย่างหนัก
หากต้องการสร้างฮาร์ดลิงก์เพียงแค่:
hln source destination
Apple File System สนับสนุนลิงก์ฮาร์ดไดรฟ์หรือไม่
ระบบไฟล์ Apple ไม่รองรับลิงก์ฮาร์ดไดรฟ์ ลิงก์ฮาร์ดไดเรคทอรีทั้งหมดจะถูกแปลงเป็นลิงก์สัญลักษณ์หรือชื่อแทนเมื่อคุณแปลงจากรูปแบบปริมาณ HFS + เป็น APFS บน macOS
ติดตามhttps://github.com/selkhateeb/hardlink/issues/31เพื่อหาทางเลือกอื่นในอนาคต
ln
คำสั่งสามารถทำให้เชื่อมโยงอย่างหนัก:
ln source destination
มีคนแนะนำให้ใช้mklinkสร้าง junction บน Windows แต่ฉันยังไม่ได้ลอง:
mklink /j "source" "destination"
ln source destination
ทำงานใน OS X ได้เช่นกัน ทดสอบกับ El Capitan
cp -al source destination
แต่คุณสามารถทำได้: `-l 'หมายถึงไฟล์ฮาร์ดลิงก์แทนที่จะคัดลอก
นี่คือเบ็ดกระทำก่อนหน้าซึ่งแทนที่ Blogs symlink ในดัชนีโดยมีเนื้อหาของ symlink เหล่านั้น
ใส่สิ่งนี้ลงใน.git/hooks/pre-commit
และทำให้มันปฏิบัติได้:
#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)
# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
"process_links_to_nondir" {} ';'
# the end
เราใช้ฟังก์ชั่นที่สอดคล้องกับ POSIX ให้มากที่สุด อย่างไรก็ตามdiff -a
ไม่เป็นไปตาม POSIX อาจเป็นไปในหมู่สิ่งอื่น ๆ
อาจมีข้อผิดพลาด / ข้อผิดพลาดบางอย่างในรหัสนี้แม้ว่าจะมีการทดสอบบ้าง
typechange
ในgit status
ไฟล์ซึ่งเป็น symlink จริง แต่ตอนนี้สิ่งที่พวกเขาไม่ได้เป็นคอมไพล์
process_links_to_nondir
อะไร?
argv[0]
ซึ่งใช้เป็นชื่อคำสั่งสำหรับsh
กระบวนการ (เอาฉันสักเล็กน้อยที่จะคิดออกเพราะฉันจำไม่ได้ว่ามันคืออะไรทั้ง☺😃)
find: missing argument to -exec'
มันมีการแสดง อาจจำเป็นต้องใช้คำสั่งทีละขั้นตอนแทนการไพพ์ & รวมทุกอย่างไว้ในบรรทัดเดียว
typechange
เช่น @DavidFraser แต่ไฟล์ที่เชื่อมโยงดูเหมือนว่าจะไม่ได้รับการจัดฉากอีกต่อไป)
เมื่อวันที่MacOS
(ฉันมีซ้อม / 10.14, git
รุ่น 2.7.1) bindfs
การใช้งาน
brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>
มันถูกบอกใบ้โดยความคิดเห็นอื่น แต่ไม่ได้ระบุไว้อย่างชัดเจนในคำตอบอื่น หวังว่านี่จะช่วยประหยัดเวลาของใครบางคน
Failed to resolve
... No such file or directory
ข้อผิดพลาดยกเว้นว่าฉันใช้ชื่อพา ธ แบบเต็มกับbindfs
คำสั่ง
ฉันเคยเพิ่มไฟล์เกิน symlink มาซักพักแล้ว สิ่งนี้เคยทำงานได้ดีโดยไม่ต้องมีการเตรียมการพิเศษ ตั้งแต่ฉันอัปเดตเป็น Git 1.6.1 สิ่งนี้ไม่ทำงานอีกต่อไป
คุณอาจเปลี่ยนไปใช้ Git 1.6.0 เพื่อทำงานนี้ได้ ฉันหวังว่า Git รุ่นอนาคตจะมีการตั้งค่าสถานะเพื่อgit-add
ให้สามารถติดตาม symlink ได้อีกครั้ง
ฉันเบื่อกับการแก้ปัญหาทุกอย่างในที่นี้ไม่ว่าจะล้าสมัยหรือต้องการรูทดังนั้นฉันจึงสร้างโซลูชันที่ใช้ LD_PRELOAD (Linux เท่านั้น)
มันเชื่อมโยงกับภายในของ Git โดยเอาชนะ 'นี่คือ symlink หรือไม่' ฟังก์ชั่นช่วยให้ symlink จะถือว่าเป็นเนื้อหาของพวกเขา ตามค่าเริ่มต้นลิงก์ทั้งหมดไปยังนอก repo จะถูกขีดเส้นใต้ ดูลิงค์สำหรับรายละเอียด
LD_PRELOAD
เพื่อแทนที่ฟังก์ชั่นห้องสมุด!
ด้วย Git 2.3.2+ (ไตรมาสที่ 1 ปี 2558) มีอีกกรณีหนึ่งที่ Git จะไม่ติดตาม symlink อีกต่อไป: ดูคอมมิชชัน e0d201bโดยJunio C Hamano ( gitster
) (ผู้ดูแล Git หลัก)
apply
: ห้ามสัมผัสไฟล์ใด ๆ นอกเหนือจากลิงก์สัญลักษณ์เนื่องจาก Git ติดตามลิงก์สัญลักษณ์เป็นลิงก์สัญลักษณ์พา ธ ที่มีลิงก์สัญลักษณ์ในส่วนนำของมัน (เช่น
path/to/dir/file
ที่ไหนpath/to/dir
ลิงก์สัญลักษณ์ไปยังที่อื่นไม่ว่าจะเป็นภายในหรือภายนอกต้นไม้ทำงาน) จะไม่ปรากฏในแพทช์ที่ใช้งานได้อย่างถูกต้อง ยกเว้นในกรณีที่แพทช์เดียวกันเอาลิงค์สัญลักษณ์ออกก่อนเพื่อให้สามารถสร้างไดเรกทอรีได้ตรวจจับและปฏิเสธแพตช์ดังกล่าว
ในทำนองเดียวกันเมื่ออินพุตสร้างลิงก์สัญลักษณ์
path/to/dir
และจากนั้นสร้างไฟล์path/to/dir/file
เราจำเป็นต้องตั้งค่าสถานะให้เป็นข้อผิดพลาดโดยไม่ต้องสร้างpath/to/dir
ลิงก์สัญลักษณ์ในระบบไฟล์แต่สำหรับแพทช์ใด ๆ ในอินพุตที่ออกจากพา ธ (เช่นการลบที่ไม่ใช่) ในผลลัพธ์เราจะตรวจสอบพา ธ ทั้งหมดกับแผนผังผลลัพธ์ที่แพตช์จะสร้างขึ้นโดยตรวจสอบแพตช์ทั้งหมดในอินพุตและจากนั้นเป้าหมายของแพทช์ แอ็พพลิเคชัน (ดัชนีหรือแผนผังการทำงาน)
ด้วยวิธีนี้เรา:
- รับความเสียหายหรือความผิดพลาดในการเพิ่มลิงค์สัญลักษณ์
path/to/dir
และไฟล์path/to/dir/file
ในเวลาเดียวกัน- ขณะที่ช่วยให้แพทช์ที่ถูกต้องที่เอาสัญลักษณ์แล้วเพิ่มไฟล์
link path/to/dir
path/to/dir/file
ซึ่งหมายความว่าในกรณีนั้นข้อความแสดงข้อผิดพลาดจะไม่เหมือนกับสิ่งทั่วไป"%s: patch does not apply"
แต่เป็นข้อความที่เฉพาะเจาะจงมากขึ้น:
affected file '%s' is beyond a symbolic link
อืมmount --bind
ดูเหมือนจะไม่ทำงานกับดาร์วิน
ไม่มีใครมีเคล็ดลับที่จะ?
[แก้ไข]
ตกลงฉันพบคำตอบใน Mac OS X คือการสร้างการเชื่อมโยง ยกเว้นว่า API นั้นจะไม่ถูกเปิดเผยผ่านln
ดังนั้นคุณต้องใช้โปรแกรมเล็ก ๆ ของคุณเองเพื่อทำสิ่งนี้ นี่คือลิงค์ไปยังโปรแกรมนั้น:
การสร้างลิงก์ฮาร์ดไดรฟ์ใน Mac OS X
สนุก!
ฉันใช้ Git 1.5.4.3 และมันกำลังติดตาม symlink ที่ผ่านมาหากมีเครื่องหมายทับ เช่น
# Adds the symlink itself
$ git add symlink
# Follows symlink and adds the denoted directory's contents
$ git add symlink/
fatal: 'src/' is beyond a symbolic link