2017-12-12 30 views
1

몇 가지 자동 생성 바이너리 파일 = (리포지토리 동기화 필요) 기능을 가진 git 프로젝트가 있습니다.git 상태에서 변경되지 않은 바이너리 파일을 제거하려면 어떻게해야합니까?

때때로 이러한 파일은 내 IDE 빌드 프로세스에 의해 업데이트되지만 파일은 수정되지 않습니다. git 명령은 이러한 파일을 수정 된 것으로 잘못보고합니다. 이 파일들이 실제 수정되지 않았을 때 git status 또는 다른 git 개의 검색어에 나타나지 않도록하고 싶습니다.

How can I remove unmodifed binary files from git status?

+1

당신이하고있는 일을 잘 알고있을 것입니다 만,이 질문을 찾는 새로운 사람은 그렇지 않을 수도 있습니다 : 가능한 한, 자식에게 이진 파일을 추가하지 마십시오. .gitignore 파일을 사용하여 자식 상태를 숨길 수 있습니다. 보통 바이너리 파일은 IDE 또는 일부 설치/설정/생성 스크립트에 의해 소스 파일 (git에 속함)에서 생성 될 수 있습니다. – dauer

+0

@dauer, 그건 초보자들에게 좋은 생각입니다. 그러나, 내 프로젝트는 이진 프로젝트 릴리스입니다. 이것을 필요로하는 방법은 없습니다. 명확하게 : 나는 바이너리 파일을 숨기거나 제외하려고하지 않고있다. git을 사용하여 수정 된 내용을 추적하고있다. 프로젝트에있는 유일한 텍스트 파일은 LICENSE, README.MD, 지원 스크립트입니다. 다른 사람들의 생각을 책임지는 것은 질문에만 해당되지 않습니다. –

+0

[여기에서 프로젝트를 탐색 할 수 있습니다.] (https://www.github.com/hypersoft/Krypton) –

답변

0

사용 git-checkout-unmodified-binaries.

명령 요구 사항 :이 프로그램은 두 개 이상의 인수를 bash, md5sum, git

.

첫 번째 인수는 git 프로젝트의 루트 경로이며 다른 모든 매개 변수는 수정 테스트를 위해 선택하려는 git 루트와 관련된 파일입니다.

(1) 명령은 모든 수정 된 파일의 목록을

(2) 다음은 묻습니다을 git, 파일이 실제로 이전에 저장된 MD5 기록에서 수정 된 경우 계산 md5sum 프로그램을 사용합니다 목록과 대조하여 목록을 확인합니다.

(3) git이 이진 파일 수정을 잘못보고하는 경우 프로그램은 git을 사용하여 현재 분기에서 파일을 체크 아웃합니다.

참고 : 프로그램을 처음 실행할 때 지정한 파일의 현재 MD5 합계를 캐싱하는 것 외에는 아무 것도 수행하지 않습니다. 그 후에는 MD5 파일을 사용하여 현재 파일 세트를 비교합니다. 비교가 완료되면 새 MD5 합계 파일이 생성됩니다.

이 아기에게 exec 호출을 어딘가에 빌드 프로세스로 보내야합니다. 일반적으로 모든 것을 빌드 한 직후, 그리고 변경 사항을 적용하기 직전에. 사용자 정의 커밋 명령이있는 경우 명령을 실행하기 직전에이 도구를 실행하고있을 가능성이 높습니다.

당신은 생각할 수도 있습니다. 왜 자동으로 그렇게하지 않습니까? 너와 내가 똑같은 생각하고있어. 거기에 대한 옵션을 어딘가에있을 수 있습니다,하지만 내 빌드/vcs 도구를 그렇게 구성 할 수 있도록 허용하지, 여기에 내가 생각해 냈습니다.

소스 리스팅 :

#!/usr/bin/env bash 

# This is a Git tool which zaps-auto-generated-binaries, which have not 
# been modified from the previous version. 

# This tool is designed to help keep commit history clean and concise. 

GITROOT="`realpath $1`"; shift; 

MD5FILES="[email protected]"; 

MD5CACHE=${GITROOT}/MD5; 

md5.cache() { md5sum -b $MD5FILES > $MD5CACHE; } 
md5.unmodified.files() { md5sum -c $MD5CACHE | grep OK | cut -d: -f1; } 

git.modified.files() { git ls-files -m; } 

params.contains() { 
    match="$1"; shift; 
    for arg; do [[ "$match" == "$arg" ]] && echo $arg; done; 
} 

filter.matches() { 
    while read line; do 
    params.contains "$line" "[email protected]"; 
    done; 
} 

(
cd $GITROOT; 
[[ -e "$MD5CACHE" ]] && { 
    FILES=$(git.modified.files | filter.matches $(md5.unmodified.files)) 
    [[ -n "$FILES" ]] && git checkout $FILES; 
} 
md5.cache; 
) 

- 사용법 UPDATE - 당신은 경우이 명령을 실행 한 후 생성 된 소스를 터치해야합니다

:

(1) 빌드 도구 '수상 바이너리를 덮어 쓰거나 업데이트하지 않으며,

(2) 빌드 후 (예 : 실시간 응용 프로그램 테스트주기) 변경 사항을 커밋하지 않았습니다.

이것은 배포 저장소의 파일에 git checkout ... 조작으로 접근 할 수 있기 때문입니다. 작업 트리를 정리합니다.

일반적으로 명령을 실행 한 후 touch (유닉스는 파일의 현재 시간을 write-time-stamp로 업데이트 할 수 있음)의 생성 된 모든 소스를 안전하게 보호 할 수 있지만 그 수는 처리해야 할 파일 및 운영 체제 및 하드웨어와 함께 각각의 크기가 포함됩니다. 가장 주목할만한 지연은 md5 sum 계산으로 인해 파일 크기가됩니다.

이 문서/업데이트를 요약하면 다음과 같습니다. 이 명령을 실행 한 후 생성 된 소스의 쓰기 타임 스탬프를 업데이트해야합니다. 다음에 명령을 실행할 때 git 사이에서 다시 생성 된 파일은 커밋되지만 git 커밋되지 않은 파일은 커밋됩니다 다시 필터 처리; 변경 사항을 커밋하기 전에 라이브 (로컬 바이너리 배포판 git 루트) 저장소에서 더 많은 빌드/테스트 & 편집을 수행 할 수 있습니다.

- 사용법 UPDATE - 유통 루트에서

오히려 파일 타임 스탬프와 혼란보다, 삭제할 수 있습니다 자동으로 생성 된 파일 복사, 이전의 건물. 누락 된 파일 조건 (들)은 대부분의 빌드 도구가 강제로 복사/재 생성되도록합니다. 나는 생성 된 파일을 위해 여러 캐시 폴더 (libs, docs 등)를 사용하고, 단순히 배포 git 프로젝트 루트에 파일을 복사하는 배포 단계가있다. 이 방법은 빌드 도구와 일관되게 작업 할 수있는 유일한 방법입니다. (IntelliJ-IDEA) 마일리지는 다를 수 있지만 빌드 도구가 실제로 어떻게 작동하는지 이해하는 경우이 도구는 훌륭한 솔루션입니다.