어떻게 바이너리 파일은 무시 될 수있다 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 @VonC
같은 것을 추가하십시오
*.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 '.*/.*/.*'
하위 디렉토리에 실행 파일을 포함시키지 않으려는 경우 옵션 으로 추가 할 수 있습니다 .
당신은 당신의 시도 할 수 있습니다 .gitignore
:
*
!*.c
이 방법에는 많은 단점이 있지만 소규모 프로젝트에는 적합합니다.
makefile을 사용하는 경우 make 규칙을 수정하여 새 바이너리 이름을 .gitignore 파일에 추가 할 수 있습니다.
다음은 작은 Haskell 프로젝트를위한 Makefile의 예입니다.
all: $(patsubst %.hs, %, $(wildcard *.hs))
%: %.hs
ghc $^
grep -xq "$@" .gitignore || echo $@ >> .gitignore
이 makefile은 Haskell 코드에서 실행 파일을 작성하기위한 규칙을 정의합니다. ghc가 호출 된 후 .gitignore에서 바이너리가 이미 있는지 확인합니다. 그렇지 않은 경우 바이너리 이름을 파일에 추가합니다.
이진 파일은 종종 확장자가 없습니다. 이것이 당신의 경우라면 이것을 시도하십시오 :
*
!/**/
!*.*
파일을 사용하는 또 다른 솔루션이 있습니다. 이런 식으로 실행 스크립트는 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/
만이 줄도 선택 사항입니다.
GOPATH 디렉토리에 두 개의 항목이있는 .gitignore 파일을 작성했습니다.
/bin
/pkg
현재 컴파일 된 모든 개발을 무시합니다.
.gitignore는 glob 프로그래밍 을 사용 하여 적어도 Linux에서 파일을 필터링합니다.
나는 Meetup에서 코딩 연설을하려고 준비 중이며, 제시하려는 순서에 따라 이름이 지정된 여러 하위 디렉토리 (01_subject1, 02_subject2, 03_subject3)로 디렉토리를 만들었습니다. 각 서브 디렉토리에는 공통의 지시에 따라 확장자가없는 소스 파일 이름과 이름이 일치하는 실행 파일로 컴파일되는 언어 종속 확장자를 가진 소스 파일이 있습니다.
다음 .gitignore 줄을 사용하여 숫자로 접두어 붙은 디렉토리에서 컴파일 된 파일을 제외합니다.
[0-9][0-9]_*/[!\.]*
문서에 대한 나의 이해에 따르면 작동하지 않아야합니다. 뒤에 별표가 있으면 '.'을 포함하여 지정되지 않은 문자 수와 일치해야하므로 실패해야합니다. + 확장. [!\.]
마침표가없는 단일 문자 만 일치 하므로 후행 별표를 생략하면 실패하고 수행해야 합니다. 그러나 정규 표현식과 마찬가지로 후행 별표를 추가하여 작동합니다. 작업에 따르면, git 은 소스 파일에 대한 변경을 통지하지만 컴파일 된 파일에 대한 존재 또는 변경은 통지하지 않습니다.
# Ignore all
*
# Unignore all files with extensions recursively
!**/*.*
# Unignore Makefiles recursively
!**/Makefile
# other .gitignore rules...
이 .gitignore
메커니즘은 파일 내용이 아닌 파일 이름을 기반으로 만 작동합니다 . 이진 파일은 콘텐츠의 속성이므로 git에게 이진 파일을 직접 무시하지 말고 이름으로 만 무시하도록 요청할 수는 없습니다 (다른 제안처럼 모든 이진 파일 이름을 추가 하거나 적절한 방법을 사용할 수 있습니다) 명명 규칙)..gitignore
.gitignore
파일 이름에서 작동 하는 사실은 성능 측면에서 중요한 속성입니다. Git은 파일을 나열하기 만하면되지만 무시할 파일을 알기 위해 파일을 열고 읽을 필요는 없습니다. 다시 말해, Git이 내용에 따라 파일을 무시하도록 요청할 수 있다면 Git은 매우 느릴 것입니다.