자식이 특정 줄을 무시할 수 있습니까?


114

전화기의 기본 브라우저에서 테스트하는 동안 git을 사용하여 phonegap에 동기화하고 있습니다. 따라서 다음 줄이 있습니다.

var isPhoneGap = false;

분명히 빌드 할 때 이것을 변경하지만,이 한 줄을 무시하도록 git을 설정할 수있는 방법이 있습니까? 아니면 가서 자체 파일에 넣고 그런 식으로 무시해야합니까?

OSX 10.6에서 Gitx와 터미널을 사용하고 있습니다.


@ user494461 : Git 필터는이를 수행하는 방법입니다 : stackoverflow.com/a/16244970/520162
— eckes 2014 년

1
환경을 감지하고 환경 설정 파일을 사용할 수 없습니까?
— exussum

간단히 말해서 : 아니요.하지만 특정 주석 코드를 찾아 git에 게시하기 전에 제거하는 전 처리기 스크립트를 작성했습니다. 여기에서 확인하세요 : github.com/franklinchou/ahk_config/blob/master/preprocess.sh
— franklin

답변:


103

파일이 특정 유형 인 경우 다음을 선언 할 수 있습니다. 콘텐츠 필터 드라이버 를 선언 할 수 있습니다 .gitattributes( " Git 속성 " 의 "키워드 확장"에 나와 있음 ).

http://git-scm.com/figures/18333fig0702-tn.png

*.yourType filter=yourFilterName

( 원하는 경우 특정 파일에 대해 해당 필터를 설정할 수도 있습니다 )

도구:

  • yourFilterName.smudge(에서 트리거 됨 git checkout) 및

    git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
    
  • yourFilterName.clean (트리거 됨 git add )

    git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
    

파일은에서 변경되지 않은 상태로 표시 git status되지만 체크 아웃 된 버전은에 대해 올바른 값을가 isPhoneGap집니다.


1
감사합니다. 작동했습니다. git diff or git status` 를 만드는 방법을 알고 있지만 필터를 무시합니까? 그래도 무엇이 다른지 볼 수 있습니까? 내 사용 사례는 디버그 로그입니다 ... 결국 삭제하고 싶습니다 ... @jthill @VonC
— timh

1
필터가 작동하는 경우 @timh, git status 또는 git diff는 아무것도 표시하지 않아야합니다.
— VonC 2014 년

1
GIT에 더 간단한 방법이 없다는 것은 유감입니다. git ignore <filename> <linenumber>는 매우 편리합니다!
— kiedysktos

22
@kiedysktos linenumber? 라인 번호가 변경되면 어떻게됩니까?
— VonC

이것은 훌륭하게 작동했지만 Windows 사용자는 gitconfig가 어떤 문자를 보유하고 싶은지 매우 까다 롭기 때문에 약간의 이국적인 정규 표현식을 시도 할 때 문제가 발생할 수 있습니다. 나는 내 sed-calls를 별도의 helper.sh 파일에 넣고 sed sh ".git/helper.sh"매개 변수를 통해 sed로 전달했는지 확인하여 gitconfig에서 호출 했습니다 "$@"(파일 경로 만 전달되었다고 가정합니다).
— ohaal

43

당신이 사용할 수있는

git update-index --assume-unchanged [file]

추적하지 않으려는 한 파일의 변경 사항을 무시합니다. 저장소에 파일이 있어야 할 때이 솔루션을 사용하지만이 파일에는 항상 추적 할 필요가없는 일부 변경 사항이 있습니다.

파일에 중요한 변경 사항이있는 경우 다음을 수행해야합니다.

git update-index --no-assume-unchanged [file]

또한 매개 변수에 대한 Git 문서 업데이트 색인 을 참조하십시오 --[no-]assume-unchanged.

이러한 플래그를 지정하면 경로에 대해 기록 된 개체 이름이 업데이트되지 않습니다. 대신 이러한 옵션은 경로에 대해 "변경되지 않은 것으로 가정"비트를 설정 및 설정 해제합니다. "변경되지 않은 것으로 가정"비트가 켜져 있으면 git은 작업 트리 파일에서 가능한 수정을 확인하는 것을 중지하므로 작업 트리 파일을 변경할 때 git에 알리기 위해 비트를 수동으로 설정 해제해야합니다.


2
이렇게하면 git pull을 할 때 여전히 새 버전을 가져올 수 있습니까?
— Saad Rehman Shah

1
@Caffeine git pull을 수행하면 커밋 된 마지막 버전이 표시됩니다. 파일을 '--assume-unchanged'로 변경하기 전 마지막 버전이됩니다.
— Carlos

1
나는 --skip-worktree대부분의 목적에 더 나은 선택 이라고 믿습니다 . stackoverflow.com/a/39583010/4233593
— Jeff Puckett


3
이것은 특정 줄이 아닌 전체 파일에 대한 업데이트를 무시합니다
— nikoss

6

Gitx는 개별 라인을 커밋하거나 무시하도록해야하지만 (이미 알고있을 수도 있습니다) 커밋 할 때마다 그렇게해야합니다. 배포 대상 당 구성 파일 (버전 지정 가능)과 서버를 시작하는 런타임 매개 변수 (예 :)를 갖는 것이 더 낫다고 생각합니다 ./myserver --config=whatever.js.


5

계속해서 https://stackoverflow.com/a/20574486/4935114 , @Mike 는 무시하고 싶은 줄에 대해 준비된 파일에 pre-commit후크 를 만들 것을 제안했습니다 grep. 후크는 해당 라인이 준비되었는지 확인합니다. 그렇다면 echo경고이며 exit코드가 있습니다.1 있으므로 커밋 프로세스가 계속되지 않습니다.

@Mike 의 대답에 영감을 받아 , 나는 우리가 무시하고 싶은 특정 줄을 자동으로 reset ( -p플래그 와 함께 ) s ( 플래그 와 함께 ) 하는 개선 된 버전의 후크를 사용하고 있음을 발견했습니다 .

이 훅이 무시할 파일이 많은 상황에서 작동하는지 확실하지 않지만이 pre-commit훅은 특정 파일에서이 행의 변경 사항을 찾습니다 buildVars.java. 내 컴퓨터에서 테스트했을 때 후크 스크립트는 다음과 같이 보입니다.

#!/bin/sh

# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`

if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
    cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
    echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
    # BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
    if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
        echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
        exit 1
    fi
fi

설명

내가 한 일은 isPhoneGap대화식 reset프로세스 중에 정규식을 검색하는 제어 시퀀스를 에코하는 것입니다. 따라서 프레스 사용자 에뮬레이션 /을 검색 할 isPhoneGap프레스, y그는이 패치를 폐기하고 싶어 마지막으로 누를 때 물었을 때 q대화를 종료를 reset.

대화식 역 패치 프로세스는 https://git-scm.com/docs/git-add#git-add-patch에 문서화되어 있습니다.


참고 : 위의 스크립트는 변수 interactive.singleKey가 false. 으로 구성한 경우 경고 직후 명령 에서 true모든 항목 $'\n'을 제거하십시오 echo.


3

다음은 git 필터를 사용 하여 수행 할 수있는 방법입니다 .

  1. gitattributes 파일 생성 / 열기 :
    • <프로젝트 루트> /. gitattributes (repo에 커밋 됨)
      또는
    • <프로젝트 루트> /. git / info / attributes (repo에 커밋되지 않음)
  2. 필터링 할 파일을 정의하는 행을 추가하십시오.
    • *.rb filter=gitignore, 즉 gitignore모든 *.rb파일에 이름 지정된 실행 필터
  3. 다음에서 gitignore필터를 정의 하십시오 gitconfig.
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", 즉이 줄 삭제
    • $ git config --global filter.gitignore.smudge cat, 즉 repo에서 파일을 가져올 때 아무것도하지 않습니다.

참고 :
물론 이것은 라인이로 끝날 때 적용되는 루비 파일 용 #gitignore이며 ~/.gitconfig. 목적에 맞게 수정하십시오.

경고!!
이것은 작업 파일을 repo와 다릅니다 (물론). 체크 아웃하거나 리베이스하면 이러한 라인이 손실됩니다! 체크 아웃, 리베이스 또는 풀에서 이러한 라인이 반복적으로 손실되기 때문에이 트릭은 쓸모가 없어 보일 수 있지만이를 사용하기위한 구체적인 사용 사례가 있습니다.

그냥 git stash save "proj1-debug" 필터가 비활성 상태에있을 때 (다만 일시적으로 비활성화 gitconfig또는 무언가). 이런 식으로 내 디버그 코드는 항상git stash apply 실수로 커밋되지 않을 까봐 걱정하지 않고 언제든지 내 코드에 사용할 수 있습니다.

이러한 문제를 처리 할 수있는 아이디어가 있지만 나중에 구현해 보겠습니다.

git 필터와 gitattributes를 언급 해준 Rudi와 jw013에게 감사드립니다.


2

콘텐츠 필터 드라이버는 좋은 솔루션이 아닙니다. git status/ etc 에서이 줄을 숨길 수 있지만 실제로 무시되지는 않습니다. 값을 변경하자마자 변경 사항이 보이지 않더라도 작업 디렉토리가 더티로 표시됩니다.

이 줄을 버전 제어에서 제외 시키려면 명령 줄 인수로 변경하거나 무시 된 포함 또는 빌드 파일에 배치하는 것이 유일한 실용적인 방법 일 수 있습니다.


"값을 변경하자마자 변경 사항이 표시되지 않더라도 작업 디렉토리가 더티로 표시됩니다.": 클린 스크립트가 여전히 파일을 원래 내용으로 복원하는 경우에는 안됩니다.
— VonC

그것이 내가 생각했던 것입니다. 나는 GitExtensions를 사용하고 있으며 diff 창이 비어 있어도 파일이 수정 된 것으로 표시됩니다. 파일 체크인까지 깨끗한 필터가 실행되지 않기 때문일 수 있습니다. 아마도 git-git이 아니라 msysgit이기 때문일 수 있습니다. IDK, YMMV
— patricktokeeffe 2014 년

1

나는 이것이 당신의 소스의 한 줄 이상에서 나오는 것일 수 있다고 생각합니다.

.userbuildconfig 파일을 포함하고 기본값을 확인하는 것이 가장 깨끗하다고 ​​생각합니다. 그런 다음 Carlos의 제안 을 사용 하여 해당 파일 만 변경되지 않은 것으로 표시 할 수 있습니다 . 이렇게하면 설정을 확인해야하는 파일의 다른 변경 사항을 놓치지 않습니다.

이를 통해 전 처리기 매크로를 로컬로 조정할 수 있습니다 (또는 Java의 경우 https://stackoverflow.com/a/1813873/1270965 와 같은 것 ).


-1

아니. .gitignore의 줄은 파일 내용이 아닌 파일 이름과 일치하므로 개별 파일 (및 그 이상) 만 무시할 수 있습니다. 이에 대한 해결책을 이미 언급했습니다. 즉, 무시하려는 콘텐츠가 포함 된 단일 파일을 무시합니다.


제 경우에는 무시 된 파일의 콘텐츠를 포함하는 것만으로 충분하고 가능하다는 데 동의합니다. 따라서 무시할 수있는 모든 설정을 이동합니다. 그곳에. 또한 무시 된 파일의 복사본을 만들어 색인에 참조로 추가 했으므로 해당 파일에있는 내용에 대한 정보가 손실되지 않습니다.
— 우르스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.