programing

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

sourcejob 2023. 9. 6. 22:02
반응형

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

나는 전화기의 기본 브라우저에서 테스트하는 동안 git을 사용하여 전화 갭에 동기화하고 있습니다.이와 같이 나는 다음과 같은 말을 합니다.

var isPhoneGap = false;

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

저는 OSX 10.6에서 Gitx와 단말기를 사용하고 있습니다.

파일이 특정 유형인 경우, 다음에서 선언할 수 있는 내용 필터 드라이버를 선언할 수 있습니다..gitattributes파일("Git Attributes"의 "키워드 확장"에 표시됨):

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.


참고: 댓글오할로알드가 그들을 격리할 것을 제안합니다.sed을 합니다.helper.sh스크립트:

sed "s/isPhoneGap = .*/isPhoneGap = true/" "$@"

사용가능

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

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

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

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

다음에 대한 Gitdoc update-index 참조--[no-]assume-unchanged매개 변수.

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

계속해서 https://stackoverflow.com/a/20574486/4935114, @Mike는 다음과 같이 만들 것을 제안했습니다.pre-commitgrep무시하고 싶을 수도 있는 줄에 대한 준비된 파일에서.후크는 그 선들이 무대에 올려졌는지 확인합니다..echo 그것 ㅇexit는 의 가 1그래서 커밋 절차가 계속되지 않을 겁니다.

@Mike의 대답에 영감을 받아, 저는 아마도 자동적으로 그의 후크의 개선된 버전을 사용하게 되었습니다. reset(s와 ) ( )-pflag)무시하고 한 행.가은한선고선한g은가h고)eteg .

에서 이 , 이 이 될 이 에서 는 가 은 은 는 가 이 에서 될 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

설명.

한 가 를 를 이었습니다 은 이었습니다 를 가 은 isPhoneGapreset과정.따라서 를 누르는 사용자를 에뮬레이트합니다./다를 isPhoneGap, y이 패치를 폐기하고 싶으냐는 질문을 받고 결국에는q서에서 reset.

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


참고: 위 스크립트는 변수가false.로 . 으로 한 한 으로 true, 아무 것도 없애 버리다$'\n'echo경고 직후에 명령합니다.

Gitx는 개별 줄을 커밋하거나 무시할 수 있도록 해야 하지만, 커밋할 때마다 그렇게 해야 합니다.더 것 하는 방법에 파라미터도 예:포로성는이더을을다할다수것을을(다수할다ie것포rruree(arpdeoereng ). 서버를 시작하는 방법에 대한 런타임 매개 변수(예:./myserver --config=whatever.js).

이렇게 하면 git 필터를 사용할 수 있습니다.

  1. git 특성 파일 만들기/열기:
    • root 특성project root>/.git (repo )
      오어
    • <project root>/.git/info/attributes(repo에 커밋되지 않음)
  2. 필터링할 파일을 정의하는 줄을 추가합니다.
    • *.rb filter=gitignore, 예를 들어 필터 이름을 실행합니다.gitignore*.rb
  3. 를 합니다.gitignoregitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d" 이 행을 합니다. 을 합니다 합니다 을
    • $ git config --global filter.gitignore.smudge cat, , repo에서 때 도 하지 .

문서:
물론 이것은 루비 파일을 위한 것이며, 줄이 끝날 때 적용됩니다.#gitignore으로 적용됨, 되는 으로 되는 ~/.gitconfig 필요한 경우에는 합니다. 필요에 따라 수정합니다.

경고!!
이렇게 하면 작업 파일이 레포와 다릅니다.체크아웃이나 리베이스는 이 라인들이 없어짐을 의미합니다!체크아웃, 리베이스 또는 풀링 시 줄이 반복적으로 손실되기 때문에 이 트릭은 쓸모가 없어 보일 수 있지만, 저는 이를 활용하기 위해 특정 사용 사례를 가지고 있습니다.

.git stash save "proj1-debug" 필터가 비활성화되어 있는 동안(일시적으로 비활성화만 하면 됩니다.gitconfig(혹은 뭔가).식으로 내런로그는상내s는s그내로enyeggit stash apply이 대사들이 실수로 범해지는 것에 대한 두려움 없이 언제든지 내 암호대로 할 수 있습니다.

이러한 문제를 해결하기 위한 가능한 아이디어를 가지고 있지만, 나중에 실행해 보겠습니다.

git 필터와 git 속성을 언급해주신 Rudi와 jw013님께 감사드립니다.

컨텐츠 필터 드라이버는 좋은 해결책이 아닙니다.이 줄은 다음에서 숨길 수 있습니다.git status. 것은 /etc. 은 되고 은 되고 .값을 변경하면 변경 내용이 보이지 않을 수도 있지만 작업 디렉토리가 더럽게 표시됩니다.

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

아무도 이 문제를 해결하기 위해 이 방법을 제공하지 않았다고 생각합니다. 그래서 여기 제 기술이 있습니다.로컬 레포에 있는 개인 지점에서 한 번의 리비전(실제로는 여러 개일 수 있음)에 계속 기록/디버깅/등의 작업을 수행합니다.할 때 내것을 의서능를때내든는다을고할다고을on는서ol,fe능nthdasiy든e ).my-goodiesbranch요: branch),난냥게요요게난h냥i,ohs

git checkout my-feature
git cherry-pick my-feature..my-goodies # assuming both started from the same main branch, say, my-goodies started a few (or many) revisions back

이제 기능 작업을 시작합니다.작업이 완료되면 기능 분기의 기록을 다시 작성하여 해당 수정사항이 사라집니다.

git rebase -i @{u} # set all the goodies revisions to skip, save, and go

이제 제 나뭇가지는 제 모든 맛있는 것들로부터 깨끗해지고 저는 어디든 밀어도 괜찮습니다.

제 생각에는 이것이 당신의 정보원의 한 줄 이상에서 나타나는 것 같습니다.

.userbuildconfig 파일은 그냥 포함하고 기본값을 체크인하는 것이 가장 깔끔할 것 같습니다.그러면 Carlos의 제안을 사용하여 파일만 변경되지 않은 것으로 표시할 수 있습니다.이렇게 하면 설정을 확인해야 하는 파일의 다른 변경 사항이 누락되지 않습니다.

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

아니요. .gitignore의 행이 파일 이름과 일치하고 파일 내용은 일치하지 않으므로 개별 파일(및 그 이상)만 무시할 수 있습니다.이에 대한 해결책, 즉 무시하고자 하는 내용이 포함된 단일 파일을 무시하는 것을 이미 언급했습니다.

언급URL : https://stackoverflow.com/questions/6557467/can-git-ignore-a-specific-line

반응형