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

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

var isPhoneGap = false;

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

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



답변

파일이 특정 유형 인 경우 다음을 선언 할 수 있습니다. 콘텐츠 필터 드라이버 를 선언 할 수 있습니다 .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집니다.


답변

당신이 사용할 수있는

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

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

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

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

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

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


답변

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


답변

계속해서 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.


답변

다음은 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에게 감사드립니다.


답변

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

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


답변

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

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

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