ไฟล์ไบนารีสามารถถูกละเว้นในการgit
ใช้.gitignore
ไฟล์ได้อย่างไร?
ตัวอย่าง:
$ g++ hello.c -o hello
ไฟล์ "hello" เป็นไฟล์ไบนารี สามารถgit
ละเว้นไฟล์นี้ได้หรือไม่
[^\.]*
ฉันยิ่งแปลกใจว่าคำตอบคือตรงไปข้างหน้า
ไฟล์ไบนารีสามารถถูกละเว้นในการgit
ใช้.gitignore
ไฟล์ได้อย่างไร?
ตัวอย่าง:
$ g++ hello.c -o hello
ไฟล์ "hello" เป็นไฟล์ไบนารี สามารถgit
ละเว้นไฟล์นี้ได้หรือไม่
[^\.]*
ฉันยิ่งแปลกใจว่าคำตอบคือตรงไปข้างหน้า
คำตอบ:
# Ignore all
*
# Unignore all with extensions
!*.*
# Unignore all dirs
!*/
### Above combination will ignore all files without extension ###
# Ignore files with extension `.class` & `.sm`
*.class
*.sm
# Ignore `bin` dir
bin/
# or
*/bin/*
# Unignore all `.jar` in `bin` dir
!*/bin/*.jar
# Ignore all `library.jar` in `bin` dir
*/bin/library.jar
# Ignore a file with extension
relative/path/to/dir/filename.extension
# Ignore a file without extension
relative/path/to/dir/anotherfile
!/**/
แทน!*/
; อันไหนที่ถูก? / cc
เพิ่มสิ่งที่ชอบ
*.o
ในไฟล์. gitignore และวางไว้ที่รากของ repo ของคุณ (หรือคุณสามารถวางไว้ในไดเรกทอรีย่อยใด ๆ ที่คุณต้องการ - มันจะใช้จากระดับนั้นเป็นต้นไป) และตรวจสอบมัน
แก้ไข:
สำหรับไบนารีที่ไม่มีส่วนขยายคุณจะเป็นการดีกว่าที่จะวางไว้ในbin/
หรือโฟลเดอร์อื่น หลังจากนั้นไม่มีการเพิกเฉยตามชนิดเนื้อหา
คุณสามารถลอง
*
!*.*
แต่นั่นก็ไม่ผิดพลาด
gcc
-o $@
หากต้องการผนวกไฟล์ที่สามารถใช้งานได้ทั้งหมดของคุณ.gitignore
(ซึ่งคุณอาจหมายถึงโดยการตัดสิน "ไฟล์ไบนารี" จากคำถามของคุณ) คุณสามารถใช้
find . -executable -type f >>.gitignore
หากคุณไม่สนใจเกี่ยวกับการเรียงลำดับบรรทัด.gitignore
คุณสามารถอัปเดต.gitignore
คำสั่งต่อไปนี้ซึ่งจะลบรายการที่ซ้ำกันออกไป
T=$(mktemp); (cat .gitignore; find . -executable -type f | sed -e 's%^\./%%') | sort | uniq >$T; mv $T .gitignore
โปรดทราบว่าคุณไม่สามารถไพพ์เอาต์พุตโดยตรงไปยัง.gitignore
เนื่องจากจะตัดทอนไฟล์ก่อนcat
เปิดเพื่ออ่าน นอกจากนี้คุณอาจต้องการเพิ่ม\! -regex '.*/.*/.*'
เป็นตัวเลือกในการค้นหาหากคุณไม่ต้องการรวมไฟล์ที่ปฏิบัติการได้ในไดเรกทอรีย่อย
ทางออกที่ดีที่สุดของคุณกับไบนารีคือการให้ส่วนขยายที่คุณสามารถกรองด้วยรูปแบบมาตรฐานหรือใส่ไว้ในไดเรกทอรีที่คุณสามารถกรองในระดับไดเรกทอรีได้
ข้อเสนอแนะส่วนขยายนั้นมีผลบังคับใช้มากกว่าใน Windows เนื่องจากส่วนขยายนั้นเป็นมาตรฐานและเป็นที่ต้องการโดยทั่วไป แต่ใน Unix คุณอาจใช้หรือไม่ใช้ส่วนขยายในไบนารีที่ปฏิบัติการได้ของคุณ ในกรณีนี้คุณสามารถวางไว้ในถังขยะ / โฟลเดอร์และเพิ่มbin/
ใน. gitignore ของคุณ
ในตัวอย่างขอบเขตขนาดเล็กที่เจาะจงมากคุณสามารถใส่hello
. gitignore ของคุณ
คุณอาจลองใน.gitignore
:
*
!*.c
วิธีนี้มีข้อเสียมากมาย แต่เป็นที่ยอมรับสำหรับโครงการขนาดเล็ก
หากคุณใช้ makefile คุณสามารถลองแก้ไขกฎการสร้างของคุณเพื่อผนวกชื่อไบนารีใหม่เข้ากับไฟล์. gitignore ของคุณ
นี่คือตัวอย่าง Makefile สำหรับโครงการ Haskell ขนาดเล็ก
all: $(patsubst %.hs, %, $(wildcard *.hs))
%: %.hs
ghc $^
grep -xq "$@" .gitignore || echo $@ >> .gitignore
makefile นี้กำหนดกฎสำหรับการสร้าง executables จากรหัส Haskell หลังจากเรียกใช้ ghc เราจะตรวจสอบ. gignignore เพื่อดูว่ามีไบนารีอยู่ในนั้นหรือไม่ หากไม่ใช่เราจะต่อท้ายชื่อของไบนารี่กับไฟล์
ไฟล์ไบนารีมักไม่มีส่วนขยาย หากเป็นกรณีของคุณลองสิ่งนี้:
*
!/**/
!*.*
นี่เป็นอีกวิธีใช้ไฟล์ วิธีนี้สคริปต์ที่เรียกใช้งานจะไม่สิ้นสุดใน gitignore คุณอาจต้องเปลี่ยนวิธีตีความผลลัพธ์จากไฟล์เพื่อให้ตรงกับระบบของคุณ จากนั้นคุณสามารถตั้งค่าฮุกที่ส่งคำสั่งล่วงหน้าเพื่อเรียกสคริปต์นี้ในแต่ละครั้งที่คุณส่ง
import subprocess, os
git_root = subprocess.check_output(['git', 'root']).decode("UTF-8").strip()
exes = []
cut = len(git_root)
for root, dirnames, filenames in os.walk(git_root+"/src/"):
for fname in filenames:
f = os.path.join(root,fname)
if not os.access(f,os.X_OK):
continue
ft = subprocess.check_output(['file', f]).decode("UTF-8")
if 'ELF' in ft and 'executable' in ft:
exes.append(f[cut:])
gifiles = [ str.strip(a) for a in open(git_root + "/.gitignore").readlines() ]
gitignore=frozenset(exes+gifiles)
with open(git_root+"/.gitignore", "w") as g:
for a in sorted(gitignore):
print(a, file=g)
วิธีเพิกเฉยในบางตำบลไม่เพียง แต่ในรูต:
# Ignore everything in a root
/*
# But not files with extension located in a root
!/*.*
# And not my subdir (by name)
!/subdir/
# Ignore everything inside my subdir on any level below
/subdir/**/*
# A bit of magic, removing last slash or changing combination with previous line
# fails everything. Though very possibly it just says not to ignore sub-sub-dirs.
!/subdir/**/
# ...Also excluding (grand-)children files having extension on any level
# below subdir
!/subdir/**/*.*
หรือหากคุณต้องการรวมไฟล์บางประเภทเท่านั้น:
/*
!/*.c
!/*.h
!/subdir/
/subdir/**/*
!/subdir/**/
!/subdir/**/*.c
!/subdir/**/*.h
ดูเหมือนว่ามันอาจจะทำงานเหมือนกันสำหรับทุกไดเรกทอรีย่อยใหม่หากคุณต้องการ!:
/*
!/*.c
!/*.h
!/*/
/*/**/*
!/*/**/
!/*/**/*.c
!/*/**/*.h
เครื่องหมายทับนำหน้ามีความสำคัญในสองบรรทัดแรกเท่านั้น ตัดเฉือนใน!/*/
และ!/subdir/
ยังเป็นตัวเลือก แต่เฉพาะในบรรทัดนี้
หากคุณทำตามคำสั่งเหล่านี้ในไฟล์. gitignore ของคุณและไฟล์ยังคงปรากฏขึ้นคุณอาจต้องลอง:
git rm --cached FILENAME
หลังจากนั้นเพิ่ม. gitignore ของคุณกระทำและกด พาฉันไป 40 นาทีเพื่อทำความเข้าใจว่าหวังว่านี่จะช่วยมือใหม่อย่างฉัน
ด้ายเก่า แต่ก็ยังมีความเกี่ยวข้อง ฉันเปลี่ยน makefile เพื่อให้ไฟล์ไบนารีที่เป็นผลลัพธ์หลังจากการเชื่อมโยงมีชื่อ [filname] ถังขยะแทนที่จะเป็นเพียง [ชื่อ] จากนั้นฉันก็เพิ่มไฟล์ * .bin ใน gitignore
รูทีนนี้เติมเต็มความต้องการของฉัน
ฉันไม่ทราบวิธีแก้ไขปัญหาอื่น แต่เพิ่มไปทีละ.gitignore
ตัว
วิธีหยาบในการทดสอบคือการ grep ผลลัพธ์ของคำสั่ง file:
find . \( ! -regex '.*/\..*' \) -type f | xargs -n 1 file | egrep "ASCII|text"
แก้ไข
ทำไมคุณไม่บอกชื่อคุณว่าปฏิบัติการได้hello.bin
?
.bin
นั้นเป็นแนวปฏิบัติที่ไม่ดี
เพียงเพิ่มhello
หรือ/hello
. gitignore ของคุณ ใช้ได้ทั้งงาน
hello
นอกจากนี้ยังจะละเว้นโฟลเดอร์ที่เรียกว่า
ฉันสร้างไฟล์. gitignore ด้วยสองรายการในไดเรกทอรี GOPATH
/bin
/pkg
มันไม่สนใจการพัฒนาที่รวบรวมไว้ทั้งหมดในปัจจุบัน
.gitignore ใช้การเขียนโปรแกรม globเพื่อกรองไฟล์อย่างน้อยบน Linux
ฉันกำลังจะให้รหัสการพูดคุยที่ Meetup และในการเตรียมการฉันได้สร้างไดเรกทอรีที่มีไดเรกทอรีย่อยหลายแห่งที่ตั้งชื่อตามลำดับที่ฉันต้องการนำเสนอ: 01_subject1, 02_subject2, 03_subject3 แต่ละไดเรกทอรีย่อยประกอบด้วยไฟล์ต้นฉบับที่มีนามสกุลเป็นภาษาที่คอมไพล์ไฟล์ที่ปฏิบัติการได้ซึ่งมีชื่อตรงกับชื่อไฟล์ต้นฉบับโดยไม่มีนามสกุลตามแนวทางปฏิบัติทั่วไป
ฉันแยกไฟล์ที่คอมไพล์แล้วในไดเรกทอรีที่มีตัวเลขนำหน้าด้วยบรรทัด. gitignore ต่อไปนี้:
[0-9][0-9]_*/[!\.]*
ตามความเข้าใจของฉันเกี่ยวกับเอกสารมันไม่น่าจะใช้ได้ การมีเครื่องหมายดอกจันต่อท้ายควรล้มเหลวเนื่องจากควรตรงกับจำนวนอักขระที่ไม่ได้ระบุรวมถึง '.' ส่วนขยาย + การละเว้นเครื่องหมายดอกจันต่อท้ายควรล้มเหลว (และไม่ได้) เนื่องจาก[!\.]
จับคู่อักขระที่ไม่ใช่จุดเดียวเท่านั้น อย่างไรก็ตามฉันเพิ่มเครื่องหมายดอกจันต่อท้ายตามที่ฉันต้องการสำหรับนิพจน์ทั่วไปและใช้งานได้ โดยการทำงานฉันหมายความว่าgitสังเกตเห็นการเปลี่ยนแปลงในไฟล์ต้นฉบับ แต่ไม่ใช่การมีอยู่หรือการเปลี่ยนแปลงในไฟล์ที่คอมไพล์
การสร้างคำตอบของ VenomVendors
# Ignore all
*
# Unignore all files with extensions recursively
!**/*.*
# Unignore Makefiles recursively
!**/Makefile
# other .gitignore rules...
เพิ่มสิ่งต่อไปนี้ในไฟล์. gitignore ของคุณ:
[^\.]*
คำอธิบาย:
[] encloses a character class, e.g. [a-zA-Z] means "any letter".
^ means "not"
\. means a literal dot - without the backslash . means "any character"
* means "any number of these characters"
.gitignore
กลไกการทำงานขึ้นอยู่เฉพาะในไฟล์ชื่อที่ไม่เกี่ยวกับไฟล์เนื้อหา การเป็นไฟล์ไบนารีเป็นคุณสมบัติของเนื้อหาดังนั้นคุณจึงไม่สามารถขอให้คอมไพล์ละเว้นไฟล์ไบนารีได้โดยตรง แต่เพียงเพิกเฉยกับชื่อ (และอื่น ๆ ที่แนะนำคุณสามารถเพิ่มชื่อไฟล์ไบนารีทั้งหมดของคุณ.gitignore
หรือใช้ที่เหมาะสม แบบแผนการตั้งชื่อ)
ความจริงที่ว่า.gitignore
ทำงานกับชื่อไฟล์นั้นเป็นคุณสมบัติที่มีความสำคัญต่อประสิทธิภาพ: Git ต้องการแสดงรายการไฟล์เท่านั้น แต่ไม่ต้องเปิดและอ่านเพื่อให้รู้ว่าไฟล์ใดที่จะไม่สนใจ กล่าวอีกนัยหนึ่ง Git จะช้ามากหากคุณขอให้ไม่สนใจไฟล์ตามเนื้อหาของพวกเขา