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


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.singleKeyfalse. 으로 구성한 경우 경고 직후 명령 에서 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.