วิธีติดตามไดเรกทอรี แต่ไม่ใช่ไฟล์ด้วย Git


86

ฉันเพิ่งเริ่มใช้ Git และมีปัญหากับสิ่งเดียว ฉันจะติดตามไดเรกทอรีโดยไม่ติดตามเนื้อหาได้อย่างไร

ตัวอย่างเช่นไซต์ที่ฉันกำลังทำงานอยู่อนุญาตให้อัปโหลดได้ ฉันต้องการติดตามไดเร็กทอรีการอัปโหลดเพื่อให้สร้างขึ้นเมื่อแตกกิ่งก้าน ฯลฯ แต่ไม่ใช่ไฟล์ที่อยู่ในนั้นอย่างชัดเจน (ไฟล์ทดสอบในขณะที่พัฒนา branch หรือไฟล์จริงในมาสเตอร์)

ใน. gitignore ของฉันฉันมีสิ่งต่อไปนี้:

อัพโหลด /*.*

ได้ลองด้วย (ซึ่งละเว้นทั้งไดเรกทอรี):

อัพโหลด /

ไดเร็กทอรีนี้อาจมีไดเร็กทอรีย่อย (อัพโหลด / thumbs / uploads / videos /) ฉันต้องการติดตามสิ่งเหล่านี้ แต่ไม่ใช่ไฟล์ของมัน

เป็นไปได้ด้วย Git? ฉันค้นหาทุกที่โดยไม่พบคำตอบ


Git ติดตามไฟล์เท่านั้น สิ่งที่คุณทำได้คือเล่นกับ git hooks และติดตามไฟล์ที่จะมีรายการไดเร็กทอรี (สร้างขึ้นโดยอัตโนมัติโดยใช้ hooks) แม้ว่าฉันจะไม่แน่ใจทั้งหมดว่าจะเป็นไปได้หรือไม่
ŠimonTóth

เป็นรูปธรรมมากขึ้น: Git ติดตามเนื้อหาและ (สำหรับคอมไพล์) ไดเร็กทอรีว่างไม่ใช่เนื้อหา คุณสามารถโต้แย้งไม่ว่าคุณจะเห็นด้วยหรือไม่ แต่ในฐานะ "วิธีแก้ปัญหา" อีกวิธีหนึ่งที่คุณอาจคิดถึงการสร้างไดเร็กทอรีบน build / install / when-needed อย่างไรก็ตาม: ฉันใช้ " .placeholder-file" -solution ด้วย;)
KingCrunch

1
แทนที่จะใช้ .placeholder ฉันใช้ไฟล์. gitignore สิ่งนี้ไม่เพียงดูแลการยกเว้นภายในไดเรกทอรีเท่านั้น แต่ยังทำหน้าที่เป็นตัวยึดตำแหน่งด้วย
Abizern

คำตอบ:


114

Git ไม่ได้ติดตามไดเรกทอรีมันติดตามไฟล์ดังนั้นเพื่อให้บรรลุสิ่งนี้คุณต้องติดตามไฟล์อย่างน้อยหนึ่งไฟล์ สมมติว่า.gitignoreไฟล์ของคุณมีลักษณะดังนี้:

upload/*

คุณสามารถทำได้:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

หากคุณลืม-fคุณจะเห็น:

$ git เพิ่มอัพโหลด / .placeholder
เส้นทางต่อไปนี้ถูกละเว้นโดยไฟล์. gitignore ของคุณ:
ที่อัพโหลด
ใช้ -f ถ้าคุณต้องการเพิ่มจริงๆ
ร้ายแรง: ไม่มีการเพิ่มไฟล์

จากนั้นgit statusคุณจะเห็นเมื่อใด:

# อาจารย์สาขา
#
# การกระทำเริ่มต้น
#
# การเปลี่ยนแปลงที่มุ่งมั่น:
# (ใช้ "git rm --cached ... " เพื่อเปิดเวที)
#
# ไฟล์ใหม่: อัพโหลด / .placeholder
#

เห็นได้ชัดว่าคุณสามารถทำได้:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder

ขอบคุณนี่คือสิ่งที่ฉันต้องการ
เบ็น

11
หลักการทั่วไปสำหรับตัวยึดตำแหน่งคือไฟล์ gitignore
Cascabel

2
@Jefromi อันที่จริงตามความคิดเห็นของฉันต่อ Abizern ไม่เคยคิดว่าจะใช้.gitignoreไฟล์เป็นตัวยึด
Peter Farmer

1
อ๊ะพลาดความคิดเห็นเหล่านั้นไปแล้ว
Cascabel

3
Git ไม่ได้ติดตามไดเรกทอรีมันจะติดตามไฟล์ฟังดูตลกเมื่อพวกเขาสอนคุณว่าทุกอย่างเป็นไฟล์ใน UNIX แม้แต่ไดเรกทอรีก็เป็นไฟล์
Green

38

ผมเขียนเกี่ยวกับเรื่องนี้ที่นี่

เพิ่ม. gitignore ภายในไดเร็กทอรี


1
บทความและความคิดเห็นเล็ก ๆ น้อย ๆ ที่ดี! ไม่เคยพิจารณาใช้. gitignore เป็นตัวยึดไฟล์ ....
Peter Farmer

ขอบคุณ. ฉันได้เรียนรู้บางสิ่งเพียงแค่เขียนโพสต์และรับความคิดเห็น
Abizern

1
ดูเหมือนจะมี.gitkeep
หลักการ

เพิ่งได้รับ "ha-ha" ตอนนี้ฉันหวังว่าฉันจะโหวตได้ 6 ครั้งที่แตกต่างกัน
adelowo

27

คำตอบที่ดีที่สุดที่ฉันพบคือการรวมไฟล์. gitignore ไว้ในโฟลเดอร์อัปโหลดของคุณพร้อมกับเนื้อหานี้

# Ignore everything in this directory
*
# Except this file
!.gitignore

ที่นี่คุณมีฉันจะเพิ่มไดเร็กทอรีว่างลงในที่เก็บ Git ได้อย่างไร


นี่เป็นทางออกที่สง่างามที่สุด
Muhammad Raihan Muhaimin


6

เพื่อติดตามไดเร็กทอรีเท่านั้น แต่ไม่ใช่ไฟล์ฉันทำสิ่งต่อไปนี้ ขอบคุณความคิดเห็นของ @PeterFarmer เกี่ยวกับการติดตามไฟล์เท่านั้นฉันสามารถเก็บไดเรกทอรีทั้งหมดยกเว้นไฟล์ตามที่อธิบายไว้ด้านล่าง

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

การเพิ่มสิ่งนี้ลงในไฟล์. gitignore จะได้ผล ต่อไปนี้เป็นโครงสร้างโฟลเดอร์ของฉัน

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

เมื่อฉันทำเช่นgit add . && git statusนั้นคอมไพล์จะรู้จักเฉพาะโฟลเดอร์ แต่ไม่ใช่ไฟล์

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

โปรดทราบว่าสิ่งต่อไปนี้สำหรับไฟล์. gitignore ของคุณ:

เครื่องหมายทับล่วงหน้าจะมองหาไดเร็กทอรีรากเท่านั้น

/ ผบ

เครื่องหมายดอกจันคู่ค้นหาไดเร็กทอรีศูนย์หรือมากกว่า

/ ** /


ขอขอบคุณ! ฉันใช้วิธีนี้และมีประโยชน์มาก
sebasira
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.