มีวิธีบอก git ให้รวมเฉพาะไฟล์บางไฟล์แทนที่จะเพิกเฉยต่อไฟล์บางไฟล์หรือไม่?


165

โดยทั่วไปโปรแกรมของฉันสร้างไฟล์เอาต์พุตขนาดใหญ่ (~ 1 GB) ซึ่งฉันไม่ต้องการสำรองข้อมูลไปยังที่เก็บ git ดังนั้นแทนที่จะสามารถทำ

git add .

ฉันต้องทำอะไรบางอย่างเช่น

git add *.c *.cc *.f *.F *.C *.h *.cu

ซึ่งค่อนข้างยุ่งยาก ...

ฉันรู้สึกค่อนข้างมั่นใจว่าฉันสามารถเขียนสคริปต์ Perl อย่างรวดเร็ว ls เนื้อหาไดเรกทอรีลงใน. gitignore แล้วลบไฟล์ตามไฟล์. gitinclude (หรือชื่อที่คล้ายกัน) แต่ดูเหมือนว่าแฮ็คเล็กน้อยเกินไป มีวิธีที่ดีกว่า?

คำตอบ:


231

ฉันไม่จำเป็นต้องลองตัวเอง แต่จากการอ่านTFMของฉันดูเหมือนว่ารูปแบบที่ถูกคัดค้านจะทำสิ่งที่คุณต้องการ คุณสามารถแทนที่รายการใน. gitignore ด้วยรายการที่ถูกปฏิเสธในภายหลัง ดังนั้นคุณสามารถทำสิ่งที่ชอบ:

*.c
!frob_*.c
!custom.c

หากต้องการให้ละเว้นไฟล์. c ทั้งหมดยกเว้น custom.c และทุกอย่างที่ขึ้นต้นด้วย "frob_"


20
ขอบคุณ TED สิ่งนี้ใช้ได้ผล สิ่งที่ฉันต้องทำก็คือเริ่มไฟล์. gitignore ด้วย * จากนั้นแสดงรายการรูปแบบไฟล์ทั้งหมดของฉันที่ดำเนินการโดยเครื่องหมายอัศเจรีย์
Daisy Sophia Hollman

8
แล้วโฟลเดอร์ล่ะ? ฉันไม่สามารถหาวิธีที่จะรวมโฟลเดอร์และไฟล์ไว้ข้างในโดยปฏิเสธกฎ
Marcio Cruz

4
เกี่ยวกับโฟลเดอร์โปรดตรวจสอบstackoverflow.com/questions/12799855/…
uzsolt

2
ดีมาก. ฉันใช้สิ่งนี้เพื่อมีพื้นที่เก็บข้อมูลในโฟลเดอร์ที่บ้านของฉันสำหรับสิ่งต่าง ๆ เช่น vimrc และ bashrc
Martin Capodici

1
@uzsolt ไม่ทำงานหากคุณต้องการรวมโฟลเดอร์เฉพาะไว้หนึ่งโฟลเดอร์ ดูstackoverflow.com/questions/987142/…
DiCaprio

73

สร้างไฟล์. gignignore ในพื้นที่เก็บข้อมูลของคุณและคุณต้องการติดตามเฉพาะไฟล์ c และละเว้นไฟล์อื่น ๆ ทั้งหมดจากนั้นเพิ่มบรรทัดต่อไปนี้ลงไป ....

*
!*.c

'*' จะไม่สนใจไฟล์ทั้งหมด

และ! จะลบไฟล์ไม่ให้สนใจ .... ดังนั้นที่นี่เราขอให้คอมไพล์ไม่สนใจไฟล์ c


คุณต้องการ.*ไฟล์ที่ซ่อนอยู่หรือไม่?
trusktr

2
the *wildcard ใช้แทน.ไฟล์ที่ถูกซ่อนดังนั้นจะถูกละเว้นเช่นกัน แต่.cจะรวมไฟล์ที่ซ่อนที่ลงท้ายด้วย
Rohmer

2
ใช้วิธีนี้ฉันคิดว่าไฟล์จากโฟลเดอร์ย่อยจะถูกละเว้นเช่นกัน ตรวจสอบนี้เพื่อดูรายละเอียดเพิ่มเติมstackoverflow.com/a/11853075/739436
Stelian

1
ฉันใช้วิธีนี้ในโฮมได*!.bash*
เร็กตอรี่

1
คุณอาจต้องใช้*.*Windows - ดูคำตอบโดย @Smaranjit Maiti
Martin Capodici

13

ทางออกที่ดีที่สุดเพื่อให้บรรลุเป้าหมายนี้

สร้าง.gitignoreไฟล์ในที่เก็บrootและถ้าคุณต้องการที่จะรวมเฉพาะ.cไฟล์แล้วคุณจะต้องเพิ่มบรรทัดด้านล่างไปยัง.gitignoreไฟล์

*.*
!*.c

ซึ่งจะรวมถึง.cไฟล์ทั้งหมดจากไดเรกทอรีและไดเรกทอรีย่อยซ้ำ

การใช้

*
!*.c

จะไม่ทำงานกับ git ทุกรุ่น

ทดสอบแล้ว

git เวอร์ชั่น 2.12.2.windows.2


2
ใช่ฉันมีปัญหาเดียวกันกับและมีการใช้งาน* *.*นี่คือบน Windows โดยใช้ gitbash และ git เวอร์ชัน 2.9.0.windows.1
Martin Capodici

2

หากคุณต้องการละเว้นไฟล์ แต่ไม่ใช่ไฟล์เฉพาะภายในไดเรกทอรีนี่คือวิธีที่ฉันทำ:

# Ignore everything under "directory"
directory/*
# But don't ignore "another_directory"
!directory/another_directory
# But ignore everything under "another_directory"
directory/another_directory/*
# But don't ignore "file_to_be_staged.txt"
!directory/another_directory/file_to_be_staged.txt

0

ไปงานปาร์ตี้สาย แต่โซลูชันของฉันจะมีไดเรกทอรีสำหรับแฟ้มต้นฉบับและไดเรกทอรีอื่นสำหรับแฟ้มที่ปฏิบัติการได้และผลลัพธ์ของโปรแกรมดังนี้:

+ .git
|    (...)
+ bin
|    my_exe.exe
|    my_output.txt
+ src
     some_file.c
     some_file.h 

... จากนั้นเพิ่มเฉพาะสิ่งในsrc/ที่เก็บของฉันและไม่สนใจbin/ทั้งหมด

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