programing

git 확장명이 없는 이진 파일 무시

muds 2023. 6. 25. 20:39
반응형

git 확장명이 없는 이진 파일 무시

이진파무방법는에서 이진 입니까?git 사용.gitignore 파일?

예:

$ g++ hello.c -o 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

다음과 같은 것을 추가합니다.

*.o

.gitignore 파일을 repo의 루트(또는 원하는 하위 디렉터리에 배치할 수 있음)에 저장하고 체크인합니다.

편집:

확장자가 없는 이진 파일의 경우 다음 위치에 배치하는 것이 좋습니다.bin/또는 다른 폴더.결국 내용 유형에 따라 무시할 수 없습니다.

시도해 보세요

*
!*.*

하지만 그것은 완벽하지 않습니다.

모든 실행 파일을 에 추가하려면 다음과 같이 하십시오..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 '.*/.*/.*'하위 디렉터리에 실행 파일을 포함하지 않을지 여부를 확인하는 옵션으로 사용할 수 있습니다.

이진 파일을 사용하는 가장 좋은 방법은 표준 패턴으로 쉽게 필터링할 수 있는 확장을 제공하거나 디렉터리 수준에서 필터링할 수 있는 디렉터리에 바이너리를 배치하는 것입니다.

확장은 기본적으로 필요하지만 유닉스에서는 실행 가능한 이진 파일에 확장을 사용할 수도 있고 사용하지 않을 수도 있기 때문에 확장 제안은 윈도우즈에서 더 적합합니다.이 경우에는 빈/폴더에 저장하고 다음을 추가할 수 있습니다.bin/.gitignore 파일입니다.

아주 구체적이고 작은 범위의 예에서는 다음과 같이 설명할 수 있습니다.hello.gitignore 파일입니다.

이진 파일은 확장자가 없는 경우가 많습니다.이 경우에는 다음을 수행합니다.

*
!/**/
!*.*

참조: https://stackoverflow.com/a/19023985/1060487

당신은 당신의 것을 시도할 수 있습니다..gitignore:

*
!*.c

이 방법은 여러 가지 단점이 있지만 소규모 프로젝트에서는 사용할 수 있습니다.

메이크 파일을 사용하는 경우 새 이진 이름을 .gitignore 파일에 추가하도록 메이크 규칙을 수정할 수 있습니다.

다음은 소규모 Haskell 프로젝트를 위한 Makefile의 예입니다.

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

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

이 makefile은 Haskell 코드로 실행 파일을 만들기 위한 규칙을 정의합니다.ghc가 호출된 후 .gitignore를 확인하여 이진이 이미 있는지 확인합니다.그렇지 않은 경우 파일에 이진 이름을 추가합니다.

일반적으로 가장 구체적인 Gitignore 행이 가장 적합하므로 다른 사용자가 사용자의 커밋을 체크아웃할 때 진단하기 어려운 문제가 발생하는 실수로 Git에서 파일을 숨기지 않도록 합니다.따라서 특히 디렉터리 루트에 있는 hello라는 파일만 무시하는 것이 좋습니다.이를 위해 다음을 추가합니다.

/hello

에▁.gitignore저장소의 루트에 있는 파일입니다. (또한 저장소의 다른 곳에 .gitignore 파일이 있을 수도 있습니다. 이는 Git 저장소에 나중에 이동하거나 자체 저장소로 분리할 수 있는 여러 프로젝트가 포함되어 있는 경우에도 의미가 있습니다.)

그러나 확장명이 없는 모든 파일을 무시하려면 다음을 사용할 수 있습니다.

/[^\.]*

또는 더 구체적이지 않은 경우:

[^\.]*

설명:

/  starting with / means "only in the root of the repository"
[] 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"

파일을 사용하는 다른 솔루션이 있습니다.이렇게 하면 실행 가능한 스크립트가 무시되지 않습니다.시스템과 일치하도록 파일의 출력을 해석하는 방법을 변경해야 할 수도 있습니다.그런 다음 커밋할 때마다 이 스크립트를 호출하도록 사전 커밋 후크를 설정할 수 있습니다.

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)

.gitignore 파일에서 다음 명령을 따르는데 파일이 계속 나타나는 경우 다음을 시도해 볼 수 있습니다.

git rm --cached FILENAME

그런 다음 .gitignore를 추가하고 커밋한 후 푸시합니다.그것을 이해하는 데 40분이 걸렸습니다. 이것이 저와 같은 신입생에게 도움이 되기를 바랍니다.

루트뿐만 아니라 일부 하위 디르에서도 무시하는 방법:

# 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

선행 슬래시는 처음 두 줄에서만 중요하고 다른 줄에서는 선택적입니다. in 위래치가!/*/그리고.!/subdir/또한 이 줄에서만 선택할 수 있습니다.

VenomVendors를 기반으로 한 답변

# Ignore all
*

# Unignore all files with extensions recursively
!**/*.*

# Unignore Makefiles recursively
!**/Makefile

# other .gitignore rules...

오래된 스레드지만 여전히 관련이 있습니다.링크 후 생성된 바이너리 파일의 이름이 [filname]이 되도록 makefile을 변경했습니다.[filname]만 대신 bin으로 입력합니다.그런 다음 gitignore에 *.bin 파일을 추가했습니다.
이 루틴은 제 요구를 충족시켜 줍니다.

나는 그것들을 하나씩 추가하는 것 외에는 다른 해결책을 모릅니다..gitignore.

테스트하는 방법은 file 명령 출력을 grep하는 것입니다.

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

편집

실행 파일 을 지정하는 것이 ?hello.bin?

그냥추를 추가하세요.hello또는/hello.gitignore 파일입니다.둘 다 됩니다.

.gitignore메커니즘은 파일 내용이 아닌 파일 이름만 기반으로 작동합니다.이진 파일이 되는 것은 콘텐츠의 속성이므로 git에게 이진 파일을 무시하도록 직접 요청할 수 없고 이름만 무시하도록 요청할 수 있습니다(그리고 다른 제안 사항처럼 모든 이진 파일 이름을 추가할 수 있습니다)..gitignore또는 적절한 명명 규칙을 사용합니다.

▁▁fact은▁the실..gitignore파일 이름에 대한 작업은 성능 측면에서 중요한 속성입니다.Git는 파일을 나열하기만 하면 되지만 무시할 파일을 확인하기 위해 파일을 열고 읽을 필요는 없습니다.다시 말해, 만약 당신이 그들의 내용에 근거하여 파일을 무시하도록 요청할 수 있다면 Git은 엄청나게 느릴 것입니다.

GOPATH 디렉토리에 두 개의 항목이 있는 .gitignore 파일을 만들었습니다.

/bin
/pkg

현재 컴파일된 모든 개발을 무시합니다.

.gitignore는 적어도 Linux에서 글로벌 프로그래밍을 사용하여 파일을 필터링합니다.

저는 곧 Meetup에서 코딩 강연을 할 예정이고, 그 준비로 제가 발표하고 싶은 순서에 따라 이름이 붙여진 몇 개의 하위 디렉터리들로 디렉토리를 만들었습니다: 01_subject1, 02_subject2, 03_subject3.각 하위 디렉터리에는 일반적인 관행에 따라 확장명이 없는 소스 파일 이름과 이름이 일치하는 실행 파일로 컴파일되는 언어 종속 확장명을 가진 소스 파일이 포함됩니다.

.gitignore 행이 다음과 같은 숫자 접두사 디렉터리의 컴파일된 파일은 제외합니다.

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

제가 문서로 이해한 바로는 작동하지 않아야 합니다.뒤에 별표를 지정하면 '.' + 확장자를 포함하여 지정되지 않은 문자 수와 일치해야 하므로 실패합니다.에 오는 은 실패할 왜냐하면 "는할 것이기 때문입니다."[!\.]마침표가 아닌 단일 문자만 일치합니다.하지만 정규 표현식처럼 뒤에 별표를 추가하면 작동합니다.즉, Git는 소스 파일의 변경은 인식하지만 컴파일된 파일의 존재나 변경은 인식하지 않습니다.

언급URL : https://stackoverflow.com/questions/5711120/gitignore-binary-files-that-have-no-extension

반응형