전화기의 기본 브라우저에서 테스트하는 동안 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 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.singleKey
가 false
. 으로 구성한 경우 경고 직후 명령 에서 true
모든 항목 $'\n'
을 제거하십시오 echo
.
답변
다음은 git 필터를 사용 하여 수행 할 수있는 방법입니다 .
- gitattributes 파일 생성 / 열기 :
- <프로젝트 루트> /. gitattributes (repo에 커밋 됨)
또는 - <프로젝트 루트> /. git / info / attributes (repo에 커밋되지 않음)
- <프로젝트 루트> /. gitattributes (repo에 커밋 됨)
- 필터링 할 파일을 정의하는 행을 추가하십시오.
*.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 와 같은 것 ).