gitignore ไม่มีไฟล์ไบนารี


141

ไฟล์ไบนารีสามารถถูกละเว้นในการgitใช้.gitignoreไฟล์ได้อย่างไร?

ตัวอย่าง:

$ g++ hello.c -o hello

ไฟล์ "hello" เป็นไฟล์ไบนารี สามารถgitละเว้นไฟล์นี้ได้หรือไม่



2
ฉันประหลาดใจมากเช่นคำถามเก่าและสำคัญไม่มีคำตอบที่เหมาะสม [^\.]*ฉันยิ่งแปลกใจว่าคำตอบคือตรงไปข้างหน้า
TamaMcGlinn

สิ่งนี้ใช้ไม่ได้
timotheecour

คำตอบ:


136
# 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

1
วิธีนี้ใช้งานได้อย่างมีเสน่ห์! ฉันไม่เข้าใจว่าเพราะเหตุใดโดยยกเลิกการยกเลิก dirs ทั้งหมด "! * /" มันสามารถยกเลิกการลงทะเบียนไฟล์ย่อยที่มีนามสกุลได้หรือไม่ (เช่น aaa / bbb.c) แต่ก็ยังไม่สนใจไฟล์ย่อยที่ไม่มีนามสกุล (เช่น aaa / ccc)
dragonxlwang

4
ดูเหมือนว่าวิธีนี้ไม่ได้ผลตามที่คาดไว้หลังจากที่ผมพบว่าเมื่อมีหลายชั้นของไดเรกทอรี ...
dragonxlwang

@dragonxlwang ฉันอยากรู้ว่าสิ่งนี้จะไม่ทำงาน? stackoverflow.com/a/19023985/1426932โซลูชั่นที่ยอมรับ แตกต่างกันเล็กน้อยและใช้!/**/แทน!*/; อันไหนที่ถูก? / cc
@VonC

มันเป็นเรื่องธรรมดาในวัฒนธรรม Unix ที่จะตั้งชื่อ shell script รวมถึงไบนารี executables ที่ไม่มีส่วนขยายในกรณีนี้วิธีการแก้ปัญหานี้จะทำให้สคริปต์ถูกละเว้น แนวคิดที่ดีกว่าคือเพียงเพิ่มไบนารี executables ใน. gitignore ด้วยตนเองเมื่อใดก็ตามที่มีการเพิ่มเข้าไปในโครงการ - โดยทั่วไปมักจะไม่เกิดขึ้นทั้งหมด หากนั่นยุ่งยากเกินไปแล้วโซลูชัน makefile ที่ vedantk แนะนำจะดีกว่า
Peter Helfer

สิ่งนี้จะละเว้น makefile
VMatrix1900

42

เพิ่มสิ่งที่ชอบ

*.o

ในไฟล์. gitignore และวางไว้ที่รากของ repo ของคุณ (หรือคุณสามารถวางไว้ในไดเรกทอรีย่อยใด ๆ ที่คุณต้องการ - มันจะใช้จากระดับนั้นเป็นต้นไป) และตรวจสอบมัน

แก้ไข:

สำหรับไบนารีที่ไม่มีส่วนขยายคุณจะเป็นการดีกว่าที่จะวางไว้ในbin/หรือโฟลเดอร์อื่น หลังจากนั้นไม่มีการเพิกเฉยตามชนิดเนื้อหา

คุณสามารถลอง

*
!*.*

แต่นั่นก็ไม่ผิดพลาด


1
เพิ่มการแก้ไข มีเหตุผลใดที่คุณไม่ต้องการให้ไบนารีของคุณมีส่วนขยาย
manojlds

10
ไฟล์ที่เรียกทำงานได้มักจะไม่มีส่วนขยาย ฉันพยายามที่จะทำสิ่งเดียวกันที่นี่สำหรับไฟล์ที่สร้างขึ้นโดยผ่านgcc -o $@
Nathan Lilienthal

29

หากต้องการผนวกไฟล์ที่สามารถใช้งานได้ทั้งหมดของคุณ.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 '.*/.*/.*'เป็นตัวเลือกในการค้นหาหากคุณไม่ต้องการรวมไฟล์ที่ปฏิบัติการได้ในไดเรกทอรีย่อย


23

ทางออกที่ดีที่สุดของคุณกับไบนารีคือการให้ส่วนขยายที่คุณสามารถกรองด้วยรูปแบบมาตรฐานหรือใส่ไว้ในไดเรกทอรีที่คุณสามารถกรองในระดับไดเรกทอรีได้

ข้อเสนอแนะส่วนขยายนั้นมีผลบังคับใช้มากกว่าใน Windows เนื่องจากส่วนขยายนั้นเป็นมาตรฐานและเป็นที่ต้องการโดยทั่วไป แต่ใน Unix คุณอาจใช้หรือไม่ใช้ส่วนขยายในไบนารีที่ปฏิบัติการได้ของคุณ ในกรณีนี้คุณสามารถวางไว้ในถังขยะ / โฟลเดอร์และเพิ่มbin/ใน. gitignore ของคุณ

ในตัวอย่างขอบเขตขนาดเล็กที่เจาะจงมากคุณสามารถใส่hello. gitignore ของคุณ


15

คุณอาจลองใน.gitignore:

*
!*.c

วิธีนี้มีข้อเสียมากมาย แต่เป็นที่ยอมรับสำหรับโครงการขนาดเล็ก


3
มันจะดีถ้าคุณทำรายการข้อเสียที่สำคัญน้อยที่สุด
pjvds

ข้อเสียที่เห็นได้ชัดคือลำดับของกฎการอนุญาตให้ปฏิเสธวิธีที่เหมาะสมคือการเพิกเฉยต่อไฟล์ที่ไม่พึงประสงค์เท่านั้นไม่ใช่การไม่อนุญาตทั้งหมดแล้วรวมไฟล์ที่ต้องการเท่านั้น
Andrei Beliankou

13

หากคุณใช้ makefile คุณสามารถลองแก้ไขกฎการสร้างของคุณเพื่อผนวกชื่อไบนารีใหม่เข้ากับไฟล์. gitignore ของคุณ

นี่คือตัวอย่าง Makefile สำหรับโครงการ Haskell ขนาดเล็ก

all: $(patsubst %.hs, %, $(wildcard *.hs))

%: %.hs
    ghc $^
    grep -xq "$@" .gitignore || echo $@ >> .gitignore

makefile นี้กำหนดกฎสำหรับการสร้าง executables จากรหัส Haskell หลังจากเรียกใช้ ghc เราจะตรวจสอบ. gignignore เพื่อดูว่ามีไบนารีอยู่ในนั้นหรือไม่ หากไม่ใช่เราจะต่อท้ายชื่อของไบนารี่กับไฟล์


ตอนนี้เป็นวิธีที่แตกต่าง
René Nyffenegger


5

นี่เป็นอีกวิธีใช้ไฟล์ วิธีนี้สคริปต์ที่เรียกใช้งานจะไม่สิ้นสุดใน 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)

ฉันสร้างสคริปต์ที่คล้ายกันและโพสต์ในคำถามที่ซ้ำกัน: stackoverflow.com/a/28258619/218294 รหัสของคุณคือ nicer :) ของฉันอาจจะทำงานได้เร็วขึ้นเนื่องจากเรียกใช้ "ไฟล์" เพียงครั้งเดียวหรือสองสามครั้ง (โดยใช้ xargs)
Sam Watkins

4

วิธีเพิกเฉยในบางตำบลไม่เพียง แต่ในรูต:

# 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/ยังเป็นตัวเลือก แต่เฉพาะในบรรทัดนี้


3

หากคุณทำตามคำสั่งเหล่านี้ในไฟล์. gitignore ของคุณและไฟล์ยังคงปรากฏขึ้นคุณอาจต้องลอง:

git rm --cached FILENAME

หลังจากนั้นเพิ่ม. gitignore ของคุณกระทำและกด พาฉันไป 40 นาทีเพื่อทำความเข้าใจว่าหวังว่านี่จะช่วยมือใหม่อย่างฉัน


2

ด้ายเก่า แต่ก็ยังมีความเกี่ยวข้อง ฉันเปลี่ยน makefile เพื่อให้ไฟล์ไบนารีที่เป็นผลลัพธ์หลังจากการเชื่อมโยงมีชื่อ [filname] ถังขยะแทนที่จะเป็นเพียง [ชื่อ] จากนั้นฉันก็เพิ่มไฟล์ * .bin ใน gitignore
รูทีนนี้เติมเต็มความต้องการของฉัน


1

ฉันไม่ทราบวิธีแก้ไขปัญหาอื่น แต่เพิ่มไปทีละ.gitignoreตัว

วิธีหยาบในการทดสอบคือการ grep ผลลัพธ์ของคำสั่ง file:

find . \( ! -regex '.*/\..*' \) -type f | xargs -n 1 file | egrep "ASCII|text"

แก้ไข

ทำไมคุณไม่บอกชื่อคุณว่าปฏิบัติการได้hello.bin?


เพราะการตั้งชื่อไฟล์ปฏิบัติการที่มีนามสกุลไฟล์.binนั้นเป็นแนวปฏิบัติที่ไม่ดี
MD XF


0

ฉันสร้างไฟล์. gitignore ด้วยสองรายการในไดเรกทอรี GOPATH

/bin
/pkg

มันไม่สนใจการพัฒนาที่รวบรวมไว้ทั้งหมดในปัจจุบัน


0

.gitignore ใช้การเขียนโปรแกรม globเพื่อกรองไฟล์อย่างน้อยบน Linux

ฉันกำลังจะให้รหัสการพูดคุยที่ Meetup และในการเตรียมการฉันได้สร้างไดเรกทอรีที่มีไดเรกทอรีย่อยหลายแห่งที่ตั้งชื่อตามลำดับที่ฉันต้องการนำเสนอ: 01_subject1, 02_subject2, 03_subject3 แต่ละไดเรกทอรีย่อยประกอบด้วยไฟล์ต้นฉบับที่มีนามสกุลเป็นภาษาที่คอมไพล์ไฟล์ที่ปฏิบัติการได้ซึ่งมีชื่อตรงกับชื่อไฟล์ต้นฉบับโดยไม่มีนามสกุลตามแนวทางปฏิบัติทั่วไป

ฉันแยกไฟล์ที่คอมไพล์แล้วในไดเรกทอรีที่มีตัวเลขนำหน้าด้วยบรรทัด. gitignore ต่อไปนี้:

[0-9][0-9]_*/[!\.]*

ตามความเข้าใจของฉันเกี่ยวกับเอกสารมันไม่น่าจะใช้ได้ การมีเครื่องหมายดอกจันต่อท้ายควรล้มเหลวเนื่องจากควรตรงกับจำนวนอักขระที่ไม่ได้ระบุรวมถึง '.' ส่วนขยาย + การละเว้นเครื่องหมายดอกจันต่อท้ายควรล้มเหลว (และไม่ได้) เนื่องจาก[!\.]จับคู่อักขระที่ไม่ใช่จุดเดียวเท่านั้น อย่างไรก็ตามฉันเพิ่มเครื่องหมายดอกจันต่อท้ายตามที่ฉันต้องการสำหรับนิพจน์ทั่วไปและใช้งานได้ โดยการทำงานฉันหมายความว่าgitสังเกตเห็นการเปลี่ยนแปลงในไฟล์ต้นฉบับ แต่ไม่ใช่การมีอยู่หรือการเปลี่ยนแปลงในไฟล์ที่คอมไพล์



0

เพิ่มสิ่งต่อไปนี้ในไฟล์. 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"

0

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

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

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