Git - '가정 변경 없음'과 '스킵 워크트리'의 차이점
저장소에 커밋하지 않을 파일의 로컬 변경 사항이 있습니다.서버에 애플리케이션을 빌드하기 위한 설정 파일이지만, 다른 설정으로 로컬로 빌드하고 싶습니다.당연히 스테이징 대상으로 'git status'를 하면 파일이 항상 나타납니다.저는 이 특별한 변화를 숨기고 그것을 약속하지 않고 싶습니다.다른 변경은 하지 않겠습니다.
명확하게 말하면, .gitignore를 사용하는 것은 새로운 파일이 추가되는 것을 방해할 뿐이므로 제가 원하는 것은 아닙니다.저장소에 이미 있는 파일의 변경 사항을 무시합니다.
두 .assume-unchanged
★★★★★★★★★★★★★★★★★」skip-worktree
이전 질문에서는 이러한 문제에 대해 설명하지만 차이점을 실제로 설명하지는 않습니다.
두 명령어는 어떻게 다릅니까?왜 누군가 둘 중 하나를 사용했을까요?
싶다skip-worktree
.
assume-unchanged
는 파일 하는 데 이 많이 하면, 「비트를 설정해 주세요」라고 합니다.비트를 설정하면git
(물론) 작업 복사본에서 인덱스의 해당 부분에 해당하는 파일이 변경되지 않은 것으로 가정합니다. 것을 수 .stat
이 비트는 인덱스 내의 파일 엔트리가 변경될 때마다(즉, 파일이 업스트림으로 변경될 때) 손실됩니다.
skip-worktree
그 이상이다: 심지어git
파일이 변경되었음을 인식한다(또는 변경되어야 한다).reset --hard
그렇지 않은 척하고 인덱스의 버전을 대신 사용합니다.이것은 인덱스가 폐기될 때까지 지속됩니다.
이 차이에 따른 영향과 일반적인 사용 사례에 대해서는http://http://fallengamer.livejournal.com/93321.html 를 참조해 주세요.
그 기사부터:
--assume-unchanged
개발자가 파일을 변경하지 않아야 한다고 가정합니다.이 플래그는 SDK와 같이 변경되지 않는 폴더의 성능을 향상시키기 위한 것입니다.--skip-worktree
특정 파일은 개발자가 변경해야 하므로 절대 만지지 말라고 git에 지시할 때 유용합니다.예를 들어 메인 저장소 업스트림에서 일부 운영 가능한 구성 파일을 호스트하고 이러한 파일에 대한 변경을 실수로 커밋하고 싶지 않은 경우--skip-worktree
네가 원하는 게 바로 그거야
주의: fallengamer는 2011년에 몇 가지 테스트를 실시했습니다(구식일 가능성이 있습니다).그 결과, 다음과 같습니다.
운용
- 와 업스트림 되었습니다.
다음과 같습니다git pull
.
Git git git git git git git git git git git git git git git 。
따라서 플래그로 표시한 데이터는 실수로 손실되지 않습니다.- 플래그가 있는 파일: Git이 로컬 파일을 덮어쓰지 않습니다.대신 충돌을 출력하고 해결 방법을 조언합니다.
- 플래그가 있는 파일: Git이 로컬 파일을 덮어쓰지 않습니다.대신 충돌을 출력하고 해결 방법을 조언합니다.
- 업스트림 모두에서 풀하려고 .
git stash
git pull
「」를 사용합니다.skip-worktree
따라서 수동 작업이 추가로 수행되지만 로컬 변경 사항이 있더라도 데이터가 손실되지는 않습니다.- 플래그가 있는 파일:로컬 변경을 모두 파기하고 복원할 수 없습니다.효과는 다음과 같습니다.
git reset --hard
. ' ' 'git pull
- 플래그가 있는 파일: Stash가 작동하지 않음
skip-worktree
'파일이요.git pull
는 위와 같은 오류로 인해 실패합니다.으로 리셋할 가 있다.skip-worktree
가 난 것을 할 수 를 설정하다pull
.
- 플래그가 있는 파일:로컬 변경을 모두 파기하고 복원할 수 없습니다.효과는 다음과 같습니다.
- 변경 , 완료, 업스트림파일 변경 완료
git pull
두 플래그 모두 업스트림 변경을 가져올 수 있습니다.이 Git을 망가뜨린 합니다.assume-unchanged
깃발을 리셋하여 현실을 반영할 것을 약속하고 선택한다.- 플래그가 있는 파일: 콘텐츠가 업데이트되고 플래그가 손실됩니다.
git ls-files -v
이 '아니다'로 .H
:h
를 참조해 주세요. - 플래그가 있는 파일: 내용이 업데이트되고 플래그가 유지됩니다.
git ls-files -v
'어울릴 수 없다'를 .S
pull
.
- 플래그가 있는 파일: 콘텐츠가 업데이트되고 플래그가 손실됩니다.
- 파일 후
git reset --hard
Git에 터치하지skip-worktree
& reality 된 파일이 변경됨)를 reality 파일에 합니다.assume-unchanged
★★★★★★ 。- 플래그가 있는 파일:파일 내용이 되돌아갑니다.플래그가 리셋됨
H
:h
를 참조해 주세요. - 플래그가 있는 파일:파일 내용은 그대로입니다.플래그는 그대로입니다.
- 플래그가 있는 파일:파일 내용이 되돌아갑니다.플래그가 리셋됨
그는 다음과 같은 분석을 덧붙인다.
로컬 데이터를 보존하기 위해 매우 노력하고 있는 것 같습니다.그러나 안전하다면 업스트림 변경을 받을 수 있습니다.+ git은 플래그를 리셋하지 않습니다.
pull
.
그러나reset --hard
" 명령어를 무시하는 것은 개발자에게 끔찍한 놀라움이 될 수 있다.Assume-unchanged
수 .pull
이러한 파일 내의 로컬 변경은 중요하지 않은 것 같습니다.
참조:
의도에 대한 Junio(현 git maintainer)의 코멘트,
특히, Junio는 다음과 같은 변화가 있다고 지적합니다.
assume-unchanged
커밋될 수 "이 "Git"으로 표시된 를 결정할 수: "Git"은 "Git"으로 표시됩니다.assume-unchanged
추가 lstat(2) 비용이 발생하지 않고 변경된 경우 경로가 변경되었음을 보고할 권리가 있습니다(그 결과,git commit -a
다다'패치 추가 시 git 메일링 리스트에서 설명한 바와 같이 와의 차이.
그는 다음과 같이 결론짓는다.
사실 어느 깃발도 충분히 직관적이지 않다.
assume-unchanged
개발자가 파일을 변경하지 않아야 한다고 가정합니다.파일이 변경된 경우 변경은 중요하지 않습니다.이 플래그는 SDK와 같이 변경되지 않는 폴더의 성능을 향상시키기 위한 것입니다.
그러나 약속이 깨지고 파일이 실제로 변경되면 git은 현실을 반영하기 위해 플래그를 되돌립니다.일반적으로 변경하지 않는 폴더에 일관되지 않은 플래그가 몇 개 있어도 괜찮습니다.한편, git에 특정 파일을 절대 만지지 말라고 지시할 때는 편리합니다.이는 이미 추적된 Configuration파일에 도움이 됩니다.
업스트림 메인저장소는 일부 운영 가능한 구성을 호스트하지만 로컬 테스트를 수행할 수 있도록 구성 설정을 변경해야 합니다.또한 이러한 파일의 변경 사항을 실수로 확인하여 프로덕션 구성에 영향을 주지 않도록 해야 합니다. 경우 ★★★★★skip-worktree
이치노
Git 2.25.1(2020년 2월)에서는 위에서 언급한 "사실상 어느 플래그도 직관적이지 않다"가 더욱 명확해진다.
brian m. carlson()bk2204
의 commit 7a2dc95, commit 1b13e90(2020년 1월 22일)을 참조하십시오.
(2020년 1월 30일 Junio C Hamano가 53a8329 커밋으로 병합)
(지트 메일링 리스트)
: 사용자가 추적 대상 파일을 무시하지 않도록 합니다
doc
.서명자: Jeff King
서명자: brian m. carlsonGit이 추적하는 파일의 변경 사항을 무시하는 것은 매우 흔한 일입니다.
이 경우의 일반적인 시나리오는 IDE 설정 및 컨피규레이션파일입니다.이러한 파일은 일반적으로 추적하지 않고 템플릿메커니즘을 사용하여 추적된 파일에서 생성될 수 있습니다.
단, 사용자는 변경 전제와 워크트리 건너뛰기 비트에 대해 학습하고 이를 위해 이들 비트를 사용하려고 합니다.
이러한 비트가 설정되어 있는 경우, 많은 조작이 유저의 예상대로 동작하지만, 통상, 파일을 치환할 필요가 있는 경우는 도움이 되지 않기 때문에, 이것은 문제가 됩니다.
특정 컨피규레이션파일 등 데이터가 중요한 경우도 있고 사용자가 기꺼이 폐기할 수 있는 무관한 데이터일 수도 있기 때문에 이 경우 적절한 동작은 없습니다.
이 구성은 지원되지 않으며 사용자가 의도하지 않은 목적으로 기존 기능을 오용하여 일반적인 슬픔과 혼란을 일으키기 쉽기 때문에 사용자가 대체 솔루션을 찾아야 한다는 것을 알 수 있도록 문서의 기존 동작과 함정을 문서화합니다.
또한 많은 환경에서 성공적으로 사용되는 잘 알려진 접근법이 있기 때문에 구성 파일의 일반적인 사례에 대처하기 위한 권장 솔루션을 제공합니다.
man 페이지에는 다음이 포함됩니다.
은 자주 .
assume-unchanged
★★★★★★★★★★★★★★★★★」skip-worktree
추적되는 파일의 변경을 무시하도록 Git에 지시하는 비트.Git은 특정 작업을 수행할 때 작업 트리 파일을 인덱스와 대조하여 확인할 수 있기 때문에 예상대로 작동하지 않습니다.일반적으로 Git은 추적된 파일의 변경을 무시하는 방법을 제공하지 않으므로 대체 솔루션을 권장합니다.예를 들어 변경할 파일이 구성 파일인 경우 저장소에 샘플 구성 파일이 포함되어 무시된 이름으로 복사하여 수정할 수 있습니다.저장소에는 샘플 파일을 템플릿으로 처리하여 자동으로 수정 및 복사하는 스크립트가 포함될 수도 있습니다.
마지막 부분은 스머지/클린 스크립트를 기반으로 한 일반적인 콘텐츠필터 드라이버입니다.
다음과 같이 스킵워크트리를 사용합니다.
git update-index --skip-worktree changedfile.txt
파일 상태 확인:
git ls-files -v
S changedfile.txt
첫 번째 문자 S는 파일에 워크트리 건너뛰기 옵션이 표시되어 있음을 의미합니다.
이유:
"syslog-update-index --syslog-syslog는 추적 대상 파일에 대한 변경을 무시하기 위한 것이 아닙니다(일부 통계 정보만 남겨두기 위한 것입니다).그러니 그것을 달성하기 위한 수단으로 제안하지 마세요."
참고 항목: https://github.com/git/git/commit/936d2c9301e41a84a374b98f92777e00d321a2ea
--syslog-worktree 설명:
이 옵션은 이미 추적된 파일에 대한 변경 사항을 무시합니다.git는 작업 디렉토리의 파일에 대한 변경에 관계없이 항상 인덱스의 파일 내용과 속성을 사용합니다.이를 통해 업스트림으로 푸시하지 않을 파일을 변경할 수 있습니다.위에 표시된 대로 이 옵션을 사용합니다.
하려면 , 「」를 합니다.--no-skip-worktree
git update-index --no-skip-worktree changedfile.txt
--syslog-syslog 설명:
이 옵션은 특정 파일이 변경되었는지 확인하는 데 리소스가 많이 사용되는 사용 사례를 위해 특별히 만들어졌습니다. 예를 들어 느린 파일 시스템에서 리소스 사용을 최적화하기 위해 git은 해당 파일이 변경되었는지 확인하기 위해 파일을 검사하지 않고 작업 디렉토리에서 파일이 변경되지 않은 것으로 가정합니다.이 플래그는 파일이 업스트림으로 수정되는 등 인덱스에서 파일 항목이 변경될 때마다 손실됩니다.
다음과 같이 사용됩니다.
git update-index --assume-unchanged changedfile.txt
파일 상태 확인:
git ls-files -v
h changedfile.txt
되어 있음을 옵션을 하려면 , 「h」를 합니다.–no-assume-unchanged
git update-index --no-assume-unchanged changedfile.txt
언급URL : https://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-and-skip-worktree
'programing' 카테고리의 다른 글
2D Excel 테이블을 1D로 "축소"하거나 "축소"하는 방법은 무엇입니까? (0) | 2023.04.10 |
---|---|
SQL Server 2000 데이터베이스에 열려 있는 트랜잭션을 나열하는 방법이 있습니까? (0) | 2023.04.10 |
셀 간격과 UICollectionView - UICollectionViewFlowLayout 크기 비율을 설정하는 방법 (0) | 2023.04.10 |
Protocol Buffer vs Json - 하나를 선택하는 경우 (0) | 2023.04.05 |
스프링 부트 비활성화/오류 매핑 (0) | 2023.04.05 |