เนื่องจากข้อ จำกัด แปลก ๆ ภายนอกฉันไม่สามารถแก้ไขที่.gitignore
เก็บของฉันได้ มีวิธีละเว้นไฟล์และไดเร็กทอรีอื่นนอกเหนือจากการแก้ไข.gitignore
หรือไม่? แม้ว่าจะเป็นโซลูชันระดับโลกเช่นการกำหนดค่าส่วนกลางที่จะนำไปใช้กับที่เก็บทั้งหมดของฉัน
เนื่องจากข้อ จำกัด แปลก ๆ ภายนอกฉันไม่สามารถแก้ไขที่.gitignore
เก็บของฉันได้ มีวิธีละเว้นไฟล์และไดเร็กทอรีอื่นนอกเหนือจากการแก้ไข.gitignore
หรือไม่? แม้ว่าจะเป็นโซลูชันระดับโลกเช่นการกำหนดค่าส่วนกลางที่จะนำไปใช้กับที่เก็บทั้งหมดของฉัน
คำตอบ:
อย่าลืมตามgitignoreว่ามีลำดับความสำคัญใน "แหล่งที่มาของรูปแบบที่ไม่สนใจ" ต่างๆที่ Git พิจารณา:
$GIT_DIR/info/exclude
.core.excludesfile
รูปแบบการอ่านจากแฟ้มที่ระบุโดยตัวแปรการกำหนดค่าสองข้อสุดท้ายอาจเป็นทางออกสำหรับปัญหาของคุณ แต่:
(ดูคำถาม SOนี้ด้วย)
อีกสองวิธีที่เกี่ยวข้องกับการอัปเดตดัชนี ( git update-index
):
git update-index --assume-unchanged
: ดู " Git: ยกเลิกการติดตามไฟล์ใน repo ในเครื่องเท่านั้นและเก็บไว้ใน repo ระยะไกล " git update-index --assume-unchanged
ในไดเรกทอรี " --no-assume-unchange
เพื่อย้อนกลับผลกระทบ: โปรดดูที่ " มันเป็นไปได้ที่จะgit add
ไฟล์ที่มีการป้องกันในขณะนี้โดยassume-unchanged
? "อย่างไรก็ตามเมื่อคุณชำระเงินสาขาอื่นหรือเมื่อคุณgit pull
สถานะ "ละเว้น" นั้นอาจถูกรีเซ็ต ดังนั้นตัวเลือกอื่น ๆ :
git update-index --skip-worktree
; ดู:
ความแตกต่างระหว่างทั้งสองมีอธิบายไว้ใน " Git - ความแตกต่างระหว่าง ' assume-unchanged
' และ ' skip-worktree
' "
update-index --skip-work-tree
คุณยังมี ฉันแก้ไขคำตอบเพื่อเพิ่มลิงก์ไปยังคำตอบเก่า ๆ ของฉันที่แสดงupdate-index
คำสั่งทั้งสองนี้
หากคุณสามารถแก้ไขได้.git/info/exclude
คุณสามารถวางกฎเดียวกันไว้ที่นั่นได้ แต่ไฟล์นั้นอยู่ใน repo ในเครื่องของคุณเท่านั้น
.git
ไดเร็กทอรีในโมดูลย่อย ...
.git
โฟลเดอร์ของโมดูลย่อยอยู่ที่parent_repo/.git/modules/submodule_name
. ดังนั้นคุณต้องแก้ไขparent_repo/.git/modules/submodule_name/info/exclude
มีสามวิธีในการบอก GIT ว่าจะละเว้นไฟล์ใด:
.gitignore
ไฟล์$GIT_DIR/.git/info/exclude
core.excludesfile
ตั้งค่าสองประเด็นหลังสามารถแก้ปัญหาของคุณได้
สำหรับข้อมูลเพิ่มเติมโปรดดูที่gitignore (5)
หากคุณแค่ต้องการมีไฟล์ในเครื่องในที่เก็บและตำแหน่งไดเร็กทอรีย่อยมีความยืดหยุ่นคุณสามารถใส่ไฟล์ของคุณเข้าไปtracked_dir1/tracked_dir2/untracked_dir/
แล้วเพิ่มไฟล์ที่tracked_dir1/tracked_dir2/untracked_dir/.gitignore
มีเนื้อหาเช่น:
*
กล่าวคือ
$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
ฉันอยู่ในสถานการณ์คล้าย ๆ กันดังนั้นฉันจึงเพิ่มโซลูชันที่ต้องการซึ่งฉันไม่เห็นกล่าวถึง ปัญหาgit update-index --assume-unchanged
ในกรณีนี้คือคุณไม่สามารถทำเช่นนั้นสำหรับไฟล์ที่ไม่ได้ติดตาม คุณบอกว่า
ฉันไม่สามารถแก้ไข. gitignore ของที่เก็บของฉันได้
ฉันจะถือว่าคุณหมายถึงว่าคุณไม่สามารถผลักดันการเปลี่ยนแปลงใด ๆ.gitignore
กับจุดเริ่มต้นได้ หากเป็นเช่นนั้นสิ่งที่คุณทำได้คือเพิ่มไฟล์ที่ไม่ได้ติดตามลงในเครื่องของคุณ.gitignore
จากนั้นgit update-index --assume-unchanged .gitignore
ให้ทำเพื่อไม่ให้การเปลี่ยนแปลงของคุณ.gitignore
ถูกผลักดัน ตอนนี้คุณกำลังละเว้นไฟล์ที่ไม่ได้ติดตาม (อาจ) และไม่มีผลกับ.gitignore
ไฟล์ระยะไกล
ละเว้นการเปลี่ยนแปลงในระบบของไฟล์ที่ติดตาม:
git update-index --assume-unchanged my-file.php
ยกเลิกการลบการเปลี่ยนแปลงในระบบของไฟล์ที่ติดตาม:
git update-index --no-assume-unchanged my-file.php
แหล่งที่มา: git help update-index
--[no-]assume-unchanged
...
This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
changed upstream, you will need to handle the situation manually.
คุณสามารถใช้วิธี global gitignore แทนการแก้ไขวิธีการในโครงการ https://help.github.com/articles/ignoring-files/#create-a-global-gitignore
อีกวิธีหนึ่ง:
.gitignore
git update-index --assume-unchanged .gitignore
update-index --assume-unchanged
@see stackoverflow.com/a/25253144/292408