전화기의 기본 브라우저에서 테스트하는 동안 git을 사용하여 phonegap에 동기화하고 있습니다. 따라서 다음 줄이 있습니다.
var isPhoneGap = false;
분명히 빌드 할 때 이것을 변경하지만,이 한 줄을 무시하도록 git을 설정할 수있는 방법이 있습니까? 아니면 가서 자체 파일에 넣고 그런 식으로 무시해야합니까?
OSX 10.6에서 Gitx와 터미널을 사용하고 있습니다.
전화기의 기본 브라우저에서 테스트하는 동안 git을 사용하여 phonegap에 동기화하고 있습니다. 따라서 다음 줄이 있습니다.
var isPhoneGap = false;
분명히 빌드 할 때 이것을 변경하지만,이 한 줄을 무시하도록 git을 설정할 수있는 방법이 있습니까? 아니면 가서 자체 파일에 넣고 그런 식으로 무시해야합니까?
OSX 10.6에서 Gitx와 터미널을 사용하고 있습니다.
답변:
파일이 특정 유형 인 경우 다음을 선언 할 수 있습니다. 콘텐츠 필터 드라이버 를 선언 할 수 있습니다 .gitattributes
( " Git 속성 " 의 "키워드 확장"에 나와 있음 ).
*.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 diff or
git status` 를 만드는 방법을 알고 있지만 필터를 무시합니까? 그래도 무엇이 다른지 볼 수 있습니까? 내 사용 사례는 디버그 로그입니다 ... 결국 삭제하고 싶습니다 ... @jthill @VonC
sh ".git/helper.sh"
매개 변수를 통해 sed로 전달했는지 확인하여 gitconfig에서 호출 했습니다 "$@"
(파일 경로 만 전달되었다고 가정합니다).
당신이 사용할 수있는
git update-index --assume-unchanged [file]
추적하지 않으려는 한 파일의 변경 사항을 무시합니다. 저장소에 파일이 있어야 할 때이 솔루션을 사용하지만이 파일에는 항상 추적 할 필요가없는 일부 변경 사항이 있습니다.
파일에 중요한 변경 사항이있는 경우 다음을 수행해야합니다.
git update-index --no-assume-unchanged [file]
또한 매개 변수에 대한 Git 문서 업데이트 색인 을 참조하십시오 --[no-]assume-unchanged
.
이러한 플래그를 지정하면 경로에 대해 기록 된 개체 이름이 업데이트되지 않습니다. 대신 이러한 옵션은 경로에 대해 "변경되지 않은 것으로 가정"비트를 설정 및 설정 해제합니다. "변경되지 않은 것으로 가정"비트가 켜져 있으면 git은 작업 트리 파일에서 가능한 수정을 확인하는 것을 중지하므로 작업 트리 파일을 변경할 때 git에 알리기 위해 비트를 수동으로 설정 해제해야합니다.
--skip-worktree
대부분의 목적에 더 나은 선택 이라고 믿습니다 . stackoverflow.com/a/39583010/4233593
계속해서 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
.
다음은 git 필터를 사용 하여 수행 할 수있는 방법입니다 .
*.rb filter=gitignore
, 즉 gitignore
모든 *.rb
파일에 이름 지정된 실행 필터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 와 같은 것 ).