git update-index 실행 취소-변경되지 않은 <파일>


462

Git은 특정 디렉토리 / 파일을 보거나 추적하는 것을 무시합니다. 당신은 이것을 실행합니다 :

git update-index --assume-unchanged <file>

이제 어떻게 다시 실행 취소 할 수있게 되나요? (가정이라고 가정합시다.)


5
git의 성능이 문제가되지 않는 한 skip-worktree가 변경되지 않은 것보다 사용하는 것이 더 나을 것 같습니다. stackoverflow.com/questions/13630849/…
GreenAsJade

답변:


587

변경되지 않은 것으로 설정된 undo / show 디렉토리 / 파일을 얻으려면 다음을 실행하십시오 .

git update-index --no-assume-unchanged <file>

이것을 assume-unchanged실행 하는 디렉토리 / 파일 목록을 얻으려면 :

git ls-files -v|grep '^h'


7
grep 구문을 약간 개선하면 첫 번째 문자 태그가 'H'/ 'h'이외의 문자 일 수 있으므로 '^ [az]'를 사용하여 무시 된 모든 파일을 잡을 수 있습니다. 에서 git-scm.com/docs/git-ls-files :이 옵션을 식별 각 라인의 시작에서 다음 태그 (뒤에 공백)으로 파일 상태 : H :: 캐시 S : 스킵 - worktree의 M : : 병합되지 않은 R :: 제거 / 삭제 C :: 수정 / 변경 K :: 종료 예정? :: 기타
Bdoserror

8
또 다른 유용한 트릭은 git ls-files -v|grep '^h'|cut -c3-"h"접두사없이 파일 이름 만 제공합니다.
Retsam

9
더 이상 파일을 모른다면을 assume-unchanged사용하십시오 git update-index --really-refresh. 이 명령을 사용하면 git ls-files먼저 파일을 찾을 필요가 없습니다 .
theDmi

102

이것이 자주 사용하는 명령 인 경우 별명을 갖는 것도 고려할 수 있습니다. 전 세계에 추가 .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

별칭을 설정하는 방법 (아직 모르는 경우) :

git config --configLocation alias.aliasName 'command --options'

예:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

이 파일을에 저장 한 후 .gitconfig청소기 명령을 실행할 수 있습니다.

git hide myfile.ext

또는

git unhide myfile.ext

자식 문서 는 매우 도움이되었습니다.

주석에 따르면 현재 숨겨진 파일 을 찾는 데 도움이되는 별칭입니다 .

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
이 별명도 편리합니다.hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

git update-index 기능에는 다음과 같이 입력 할 수있는 몇 가지 옵션이 있습니다.

git update-index --help

여기서는 update-index 함수로 처리하는 방법에 대한 다양한 옵션을 찾을 수 있습니다.

[파일 이름을 모르는 경우]

git update-index --really-refresh 

[파일 이름을 알고있는 경우]

git update-index --no-assume-unchanged <file>

무시 목록에 추가 된 모든 파일을 되돌립니다.

git update-index --assume-unchanged <file>

git update-index --really-refresh, 팁 덕분에 내가 만든 모든 변경 사항을 취소합니다
Sérgio

git update-index --no-assume-unchanged <file>내 생명을 구했어
Cagatay Ulubay

38

나는 옵션 --assume-unchanged이 보이지 않기 때문에 당신이 의미한다고 가정 합니다 --assume-changed. 의 반대는 --assume-unchanged입니다 --no-assume-unchanged.


32

@adardesign, @adswebwork 및 @AnkitVishwakarma의 탁월한 원본 답변과 @Bdoserror, @Retsam, @seanf 및 @torek의 주석을 추가 문서 링크 및 간결한 별칭으로 합성하려면 ...

기본 명령

변경되지 않은 것으로 가정 된 파일 을 다시 정상으로 재설정 하려면 :

git update-index --no-assume-unchanged <file>

변경되지 않은 모든 파일 을 나열 하려면 다음 을 수행 하십시오 .

git ls-files -v | grep '^[a-z]' | cut -c3-

변경되지 않은 모든 가정 파일을 다시 정상으로 재설정 하려면 :

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

참고 : 다른 곳에서 나열된이 명령은 변경되지 않은 모든 가정 파일을 더 이상 재설정하지 않는 것으로 보입니다 (이전에는 솔루션으로 사용했으며 이전에 솔루션으로 나열했습니다).

git update-index --really-refresh

바로 가기

git에서 이러한 일반적인 작업을 쉽게 수행하려면 사용자 를 위해 다음 별칭 섹션을 추가 / 업데이트하십시오 .gitconfig(예 : ~/.gitconfig* nix 또는 macOS 시스템).

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
의 경우 다음을 git hidden사용하여 쉘 별명이나 스크립트없이 동일한 효과를 얻을 수 있습니다 !.hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refresh인덱스 파일에서 변경되지 않은 플래그를 지우지 않습니다.
torek

감사합니다, @torek! 설명하신 동작을 확인한 후 "모두 재설정"사례에 대한 다른 솔루션으로 답변을 업데이트했습니다.
Will Cain

20

적용된 모든 파일을 실행 취소하려는 경우 캐시 된 상태뿐만 아니라 소문자로 문자로 표시하는 상태뿐만 아니라 상태가 변경되지 않은 것으로 가정하면 다음 명령을 사용할 수 있습니다.

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v 모든 파일을 상태로 인쇄합니다
  2. grep '^[a-z]' 파일을 필터링하고 변경되지 않은 것으로 가정합니다.
  3. cut -c 3- 상태를 제거하고 경로 만 남겨두고 3 번째 문자에서 끝까지 자릅니다.
  4. tr '\012' '\000' 줄 끝 문자 (\ 012)를 0 문자 (\ 000)로 바꿉니다.
  5. xargs -0 git update-index --no-assume-unchangedgit update-index --no-assume-unchanged실행 취소 하기 위해 0으로 구분 된 모든 경로를 전달합니다.

이것은 매우 유용합니다. 자세한 정보 감사합니다!
Chamithra Thenuwara

11

에 추가 @adardesign하면 추가 된 모든 파일을 재설정하려는 경우, 응답의 assume-unchanged목록으로 no-assume-unchanged한 번에 다음을 수행 할 수 있습니다 :

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

이것은 grep ie에서 출력 된 두 문자를 "h "제거한 다음 파일 이름에있을 수있는 공백을 피하고 || true루프의 일부 파일에 오류가있는 경우 명령이 조기에 종료되지 않도록합니다.


4

Git Extensions를 사용하는 경우 다음 단계를 따르십시오.

  1. 커밋 창으로 이동하십시오.
  2. 작업 디렉토리 변경 이라는 드롭 다운을 클릭하십시오 .
  3. 선택 보기 assummed - 변경되지 않은 파일의 옵션을 선택합니다.
  4. 추측을 취소 할 파일을 마우스 오른쪽 버튼으로 클릭하십시오.
  5. 변경 안함을 선택 하지 마십시오 .

끝났습니다.


0

여기서 다루지 않은 것은 없습니다. 그러나 내 2 센트를 추가하고 싶습니다. 때로는 빌드를 실행하고 많은 파일을 변경 한 다음 무언가 작업을 원 하므로이 명령이 실제로 많은 도움이됩니다.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

다른 사람도 유용하게 사용하기를 바랍니다.


.gitignore빌드 아티팩트를 무시 하는 데 사용 하면 이점이 있다고 생각합니다 .
Nick

1
나는 .gitignore있지만 때때로 그것은 내 경험으로는 충분하지 않습니다. 그러나 나는 당신이 이것을 말하는 맥락을 이해합니다.
Tyagi Akhilesh 2016 년

0

Windows에서 나에게 도움이되는 해결책은 없습니다 . 파일 상태 H보다는 자본을 사용하는 것으로 보이며 hgrep 명령에는 ^줄의 시작과 다음 문자 무시를 나타내는 추가 캐럿이 필요합니다 .

Windows 솔루션

  1. Git Bash를 열고 관련 최상위 디렉토리로 변경하십시오.
  2. git ls-files -v | grep '^^H' 캐시되지 않은 모든 파일을 나열
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree 를 통해 수행 된 모든 파일을 건너 뛰는 파일을 실행 취소하는 방법 update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged 를 통해 수행 된 모든 파일을 건너 뛰는 파일을 실행 취소하는 방법 update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' 캐시되지 않은 모든 파일을 다시 나열하고 위의 명령이 작동했는지 확인하려면 아무것도 반환하지 않아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.