힘내- '변경되지 않은 가정'과 '건너 뛰기 작업 트리'의 차이점


450

저장소에 커밋하지 않으려는 파일에 로컬 변경 사항이 있습니다. 서버에서 응용 프로그램을 빌드하기위한 구성 파일이지만 다른 설정으로 로컬로 빌드하고 싶습니다. 당연히, 파일은 스테이지 할 무언가로 'git status'를 할 때 항상 나타납니다. 이 특정 변경 사항을 숨기고 커밋하지 않고 싶습니다. 파일을 더 이상 변경하지 않습니다.

주변을 파고 들자 '가정 변경되지 않은'과 '건너 뛰기'라는 두 가지 옵션이 있습니다. 여기서 이전 질문 은 그들에 대해 이야기하지만 실제로 차이점을 설명하지는 않습니다. 내 질문은 이것입니다 : 두 명령이 어떻게 다른가요? 왜 누군가가 하나를 사용합니까?


1
일반적으로 .gitignore비슷한 목적으로 사용 하고 있습니다. 이 솔루션이 당신에게 효과가 있습니까?
samuil

45
samuil, .gitignore는 변경하지 않고 추가를 무시합니다. 파일은 자식에 이미 때이 .gitignore에 나와있는 경우는 이벤트를 추적 할 수
그리고 리

그러나 여기에 설명 된 것처럼 "새로 고침"하기 위해 모두를 제거하고 모두 추가 할 수 있습니까? stackoverflow.com/questions/7075923/… @Grigory
Daniel Springer

2
OP의 의도를 올바르게 얻은 경우 파일을 무시해서는 안됩니다. 파일은 리포지토리에 있어야하지만 그가 만든이 매우 특정한 변경 사항은 커밋되지 않아야합니다. 적어도 지금은 아닙니다.
Simone

답변:


666

당신은 원합니다 skip-worktree.

assume-unchanged파일 그룹이 수정되었는지 확인하는 데 비용이 많이 드는 경우를 위해 설계되었습니다. 비트를 설정할 때 git(물론) 인덱스의 해당 부분에 해당하는 파일이 작업 복사본에서 수정되지 않은 것으로 가정합니다. 따라서 stat호출 의 혼란을 피 합니다. 이 비트는 색인에서 파일의 항목이 변경 될 때마다 (파일이 업스트림으로 변경 될 때) 손실됩니다.

skip-worktree그 이상 : 파일이 수정되었다는 git 것을 알고 있는 경우 에도 reset --hard색인의 버전을 사용하여 파일이 아닌 것처럼 가장합니다. 인덱스가 삭제 될 때까지 지속됩니다.

이 차이점과 일반적인 사용 사례에 대한 요약은 http://fallengamer.livejournal.com/93321.html에 있습니다.

그 기사에서 :

  • --assume-unchanged개발자 파일을 변경 해서는 안된다고 가정 합니다. 이 플래그는 SDK와 같은 변경되지 않는 폴더의 성능향상시키기 위한 것입니다.
  • --skip-worktree개발자 파일 변경 해야 하기 때문에 git에게 특정 파일을 만지지 않도록 지시 할 때 유용 합니다. 예를 들어, 메인 리포지토리 업스트림이 일부 프로덕션 지원 구성 파일을 호스팅 하고 실수로 해당 파일에 대한 변경 사항을 커밋하지 않으려 --skip-worktree는 경우 정확히 원하는 것입니다.

3
말이 되네요 skip-worktree는 실제로 갈 길인 것 같습니다. 감사!
ckb

100
몇 초 동안 검색하고 읽을 수있는 작은 메모입니다. --skip-worktree효과 를 취소 하고 플래그를 설정 해제 하려면 --no-skip-worktree옵션 이 있습니다. 정확히 같은 방식으로 작동합니다. 손이 미끄러 져 잘못된 파일에 플래그가 지정되었거나 상황이 변경되어 이전에 건너 뛴 파일을 더 이상 무시해서는 안되는 경우에 유용합니다.
drdaeman

18
위의 내 질문에 대답하기 --skip-worktree위해 .git/info/exclude파일 사용 과 파일 의 차이점 은 전자는 현재 추적되는 파일에서도 작동한다는 것입니다. .git/info/exclude과 같이 .gitignore추적되지 않은 파일을 색인에 실수로 추가하지는 않지만 이미 추적 된 파일은 변경하지 않습니다.
LinusR

13
이것을 원격으로 푸시하고 모든 클론에 의해 보존 될 수 있습니까?
CMCDragonkai

4
그냥 사용 , 부인 :git update-index --skip-worktree <file_name>
러핀

108

참고 : fallengamer 는 2011 년에 일부 테스트를 수행했으며 (구식 일 수 있음) 다음은 그의 연구 결과입니다 .

운영

  • 파일은 로컬 저장소와 업스트림에서 모두 변경됩니다
    git pull.
    Git은 로컬 변경 사항을 유지합니다.
    따라서 실수로 플래그로 표시 한 데이터는 손실되지 않습니다.
    • assume-unchanged플래그가있는 파일 : Git은 로컬 파일을 덮어 쓰지 않습니다. 대신 충돌을 해결하는 방법과 조언을 출력합니다.
    • skip-worktree플래그가있는 파일 : Git은 로컬 파일을 덮어 쓰지 않습니다. 대신 충돌을 해결하는 방법과 조언을 출력합니다.

  • 파일은 로컬 저장소에서 모두 변경하고 업스트림, 어쨌든 당겨하려고 사용하여 몇 가지 추가 수작업에 결과를하지만 로컬 변경 사항이 있다면 적어도 당신은 어떤 데이터가 손실되지 것입니다.
    git stash
    git pull
    skip-worktree
    • assume-unchanged플래그가있는 파일 : 모든 로컬 변경 사항을 복원 할 가능성없이 버립니다. 효과는 ' git reset --hard' 와 같습니다 . ' git pull'전화 성공
    • skip-worktree플래그가있는 파일 : 파일에서 Stash가 작동하지 않습니다 skip-worktree. ' git pull'는 위와 동일한 오류로 실패합니다. 개발자는 수동으로 skip-worktree플래그를 재설정 하여 오류를 숨기고 완료 할 수 있습니다 pull.

  • 로컬 변경 사항 없음, 업스트림 파일 변경됨 두 플래그 모두 업스트림 변경 사항을 얻지 못하게합니다. 힘내는 당신이 약속을 어 겼음을 감지 하고 깃발을 재설정하여 현실을 반영하기로 결정했습니다.
    git pull
    assume-unchanged
    • assume-unchanged플래그가있는 파일 : 내용이 업데이트되고 플래그가 손실됩니다.
      ' git ls-files -v'는 H(에서 h) 로 플래그가 수정되었음을 나타냅니다 .
    • skip-worktree플래그가있는 파일 : 내용이 업데이트되고 플래그가 유지됩니다.
      ' git ls-files -v'는 S이전 과 같은 플래그를 표시 합니다 pull.

  • 로컬 파일이 변경 되면 Git은 파일을 건드리지 않고 파일에 대한 실제 (실제로 변경되지 않은 것으로 약속 된 파일이 변경됨)를 반영 합니다.
    git reset --hard
    skip-worktreeassume-unchanged
    • 와 파일 assume-unchanged플래그 : 파일의 내용이 복귀한다. 플래그가 H(에서 h) (으 )로 재설정되었습니다 .
    • 와 파일 skip-worktree플래그 : 파일 내용 그대로입니다. 플래그는 동일하게 유지됩니다.

그는 다음 분석을 추가합니다.

  • 것 같습니다 skip-worktree되어 해당 지역의 데이터를 보존하기 위해 매우 열심히 노력하고 . 그러나 안전한 경우 업스트림 변경을 방지 할 수는 없습니다. 또한 git은의 플래그를 재설정하지 않습니다 pull.
    그러나 ' reset --hard'명령을 무시하면 개발자에게는 큰 놀라움이 될 수 있습니다.

  • Assume-unchanged작업에서 플래그가 손실 될 수 있으며 해당 pull파일의 로컬 변경 사항은 git에 중요하지 않은 것 같습니다.

보다:

그는 결론 :

실제로 어느 플래그도 직관적이지 않습니다 .

  • assume-unchanged개발자가 파일을 변경해서는 안된다고 가정합니다. 파일이 변경된 경우 해당 변경은 중요하지 않습니다. 이 플래그는 SDK와 같은 변경되지 않는 폴더의 성능을 향상시키기위한 것입니다.
    그러나 약속이 깨지고 파일이 실제로 변경되면 git은 플래그를 되돌려 현실을 반영합니다. 일반적으로 변경되지 않는 폴더에 일관성이없는 플래그를 사용하는 것이 좋습니다.

  • 반면에 skip-worktreegit에게 특정 파일을 만지지 않도록 지시 할 때 유용합니다. 이미 추적 된 구성 파일에 유용합니다.
    업스트림 기본 리포지토리에는 프로덕션 준비 구성이 일부 있지만 로컬 테스트를 수행 할 수 있도록 구성의 일부 설정을 변경하려고합니다. 그리고 프로덕션 구성에 영향을주기 위해 이러한 파일의 변경 사항을 실수로 확인하고 싶지는 않습니다. 이 경우 skip-worktree완벽한 장면을 만듭니다.


Git 2.25.1 (2020 년 2 월)을 사용하면 위에서 언급 한 "실제로 어느 플래그도 직관적이지 않습니다"가 더 명확 해집니다.

brian m의 commit 7a2dc95 , commit 1b13e90 (2020 년 1 월 22 일)을 참조하십시오 . 칼슨 ( bk2204) .
(의해 병합 - Junio C 하마노 gitster-53a8329 커밋 2,020 30 일월)
( 힘내 메일 링리스트 )

doc: 사용자가 추적 된 파일을 무시하지 않도록 설득

서명자 : Jeff King
서명자 : brian m. 칼슨

사용자가 Git이 추적하는 파일의 변경 사항을 무시하려는 것이 일반적입니다.

이 경우 일반적인 시나리오는 일반적으로 템플릿 메커니즘을 사용하여 추적 된 파일에서 추적 및 생성되지 않아야하는 IDE 설정 및 구성 파일입니다.

그러나 사용자는 변경되지 않은 스킵 워크 스킵 비트에 대해 배우고 어쨌든이를 사용하려고합니다.

이러한 비트가 설정되면 많은 작업이 사용자가 원하는대로 동작하지만 일반적으로 git checkout파일을 교체해야 할 때 도움이되지 않기 때문에 문제가 됩니다.

이 경우에는 특정 구성 파일과 같은 데이터가 소중하고 때로는 사용자가 폐기하는 것이 무의미한 데이터이기 때문에 합리적인 동작이 없습니다.

이 구성은 지원되는 구성이 아니며 사용자가 의도하지 않은 목적으로 기존 기능을 잘못 사용하여 일반적인 슬픔과 혼란을 유발하기 쉽기 때문에 기존 동작과 문서의 함정을 문서화하여 git update-index사용자가 대체 솔루션을 탐색해야 함을 알 수 있습니다.

또한 많은 환경에서 성공적으로 사용되는 잘 알려진 방법이 있기 때문에 일반적인 구성 파일 처리에 권장되는 솔루션을 제공합니다.

git update-index맨 페이지는 이제 포함 :

사용자가 자주 사용하려고 assume-unchangedskip-worktree추적 파일에 대한 변경 사항을 무시하는 힘내에게 비트를. Git이 특정 작업을 수행 할 때 인덱스에 대해 작업 트리 파일을 계속 검사 할 수 있으므로 예상대로 작동하지 않습니다. 일반적으로 Git은 추적 된 파일의 변경 사항을 무시할 수있는 방법을 제공하지 않으므로 대체 솔루션이 권장됩니다.

예를 들어, 변경하려는 파일이 일종의 구성 파일 인 경우 리포지토리에는 샘플 구성 파일이 포함될 수 있으며이 파일은 무시 된 이름으로 복사되어 수정 될 수 있습니다. 리포지토리에는 샘플 파일을 템플릿으로 취급하여 자동으로 수정 및 복사하는 스크립트가 포함될 수도 있습니다.

마지막 부분은 얼룩 / 깨끗한 스크립트를 기반으로 한 일반적인 콘텐츠 필터 드라이버를 설명하는 것 입니다.


8
파일에 건너 뛰기 작업 트리가 있고 업스트림 변경 사항이 있으면 git status가 파일을 변경된 것으로보고하지 않더라도 가져 오려고 할 때 "커밋 또는 숨김"이 표시됩니다. 사람들이 원산지에서 프로덕션 설정을 사용하는 동안 로컬 변경 사항을 유지할 수 있도록 어떻게 피할 수 있습니까?
GreenAsJade

3
네, 확인하실 수 있습니다. 그것은 단순히 원점과 다르게 유지하려는 로컬 파일을 갖는 것이 여전히 어렵다는 것을 의미합니다.
GreenAsJade

1
@GreenAsJade는 고대인 것보다. 2.2.x로 테스트 할 수 있습니까?
VonC

1
@VonC, "Junio ​​님의 코멘트"링크가 개정 이력에 없습니다. 인가 이것은 당신이 언급하고 있었는지?
Michael-Clay Shirky의 위치

1
@Michael 잘 잡아 주셔서 감사합니다. 나는 그 링크를 다시 답에 넣었다.
VonC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.