Programming

내용을 삭제하지 않고 많은 수의 파일을 스테이지 해제하는 방법

procodes 2020. 2. 19. 22:17
반응형

내용을 삭제하지 않고 많은 수의 파일을 스테이지 해제하는 방법


실수로 많은 임시 파일을 추가했습니다. git add -A

다음 명령을 사용하여 파일을 스테이지 해제하고 더티 인덱스를 제거했습니다.

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

위의 명령은에 나열되어 있습니다 git help rm. 그러나 슬프게도 캐시 옵션을 제공했지만 파일이 실행되면 삭제되었습니다. 내용을 잃지 않고 색인을 지우려면 어떻게해야합니까?

이 파이프 작동 방식을 누군가가 설명 할 수 있다면 도움이 될 것입니다.


git reset

지나치게 원하는 "git add"실행을 취소하는 것이 전부라면 :

git reset

변경 사항이 준비되지 않아 원하는대로 다시 추가 할 수 있습니다.


실행하지 마십시오 git reset --hard.

추가 된 파일의 스테이지를 해제 할뿐만 아니라 작업 디렉토리에서 변경 한 내용을 되돌립니다. 작업 디렉토리에 새 파일을 만든 경우 삭제 하지는 않습니다 .


당신은 자연 그대로의 REPO가 (또는 HEAD가 설정되어 있지 않은) 경우 [1] 당신은 단순히 수

rm .git/index

물론, 이것은 당신이 한 파일을 다시 추가 할 필요 않은 추가되어야합니다.


[1] 참고 (주석에 설명 된 바와 같이)는 일반적으로 리포지토리가 최신 ( "원래")이거나 커밋되지 않은 경우에만 발생합니다. 기술적으로, 체크 아웃 또는 작업 트리가 없을 때마다.

더 명확하게 :)


git reset HEAD파일을 제거하지 않고 색인을 재설정하는 데 사용하십시오 . 색인에서 특정 파일 만 재설정하려는 경우이를 사용하면됩니다 git reset HEAD -- /path/to/file.

쉘에서 파이프 연산자 stdout는 왼쪽의 프로세스를 가져 와서 stdin오른쪽의 프로세스 로 전달합니다 . 그것은이다 본질적으로 동등한 :

$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out

그러나 대신 $ proc1 | proc2, 두 번째 프로세스는 첫 번째 프로세스가 데이터를 출력하기 전에 데이터를 가져 오기 시작할 수 있으며 실제 파일은 없습니다.


git stash && git stash pop

HEAD가 설정되어 있지 않은 경우에도 할 수 있습니다

git rm -rf --cached .

모든 것을 무대에서 풀어야합니다. 이것은 실제로 sehe의 솔루션과 동일하지만 Git 내부와의 혼잡을 피합니다.


경고 : 커밋되지 않은 작업을 잃고 싶지 않으면 다음 명령을 사용하지 마십시오!

사용법 git reset이 설명되었지만 파이프 명령에 대한 설명도 요청했습니다.

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

이 명령 git ls-files은 git이 알고있는 모든 파일을 나열합니다. 이 옵션 -z은에 예상되는 형식으로 특정 형식을 적용한 xargs -0다음이를 호출 rm -f하여 승인 여부를 확인하지 않고 제거합니다.

즉, "git이 알고있는 모든 파일을 나열하고 로컬 사본을 제거하십시오".

그런 다음 git diffgit이 알고있는 다른 버전의 항목 사이의 변경 사항을 보여줍니다. 서로 다른 트리 간 변경, 로컬 복사본과 원격 복사본 간의 차이 등이 될 수 있습니다.
여기에 사용 된 비 단계적 변경 사항이 표시됩니다. 변경했지만 아직 커밋하지 않은 파일 이 옵션 --name-only은 (전체) 파일 이름 만 원하며 --diff-filter=D삭제 된 파일에만 관심이 있음을 의미합니다. (이봐, 우리는 단지 많은 것들을 삭제하지 않았는가?) 이것은 xargs -0이전에 보았던 파이프로 파이프되어 호출 git rm --cached되어 캐시에서 제거되고 작업 트리는 혼자 남겨 두어야합니다. 작업 트리에서 모든 파일을 제거했습니다. 이제 색인에서 제거되었습니다.

즉, 단계적이든 비 단계적이든 모든 변경 사항이 사라지고 작업 트리가 비어 있습니다. 외침을하고, 원본 또는 원격에서 파일을 새로 체크 아웃 한 후 작업을 다시 수행하십시오. 이 지옥의 선을 쓴 사디스트를 저주하십시오. 왜 아무도 이것을하고 싶어하는지 전혀 모르겠습니다.


TL; DR : 당신은 모든 것을 호스로 쳤습니다. 다시 시작 git reset하여 지금부터 사용하십시오 .


명령 줄 중 첫 번째 줄이 작업 복사본에서 git의 준비 영역에있는 모든 파일을 무조건 삭제 한 것 같습니다. 두 번째는 추적되었지만 이제 삭제 된 모든 파일의 스테이지를 해제했습니다. 불행히도 이는 해당 파일에 대한 커밋되지 않은 수정 사항이 손실되었음을 의미합니다.

작업 복사본과 인덱스를 마지막 커밋 상태로 되돌리려 면 다음 명령을 신중하게 사용할 수 있습니다 .

git reset --hard

나는 git reset --hard 작업 카피 와 색인 에서 커밋되지 않은 변경을 없애기 때문에 "주의해서"라고 말합니다 . 그러나이 상황에서는 마지막 커밋시 상태로 돌아가고 커밋되지 않은 변경 사항이 손실 된 것처럼 보입니다.

업데이트 : 아직 HEAD를 해결할 수 없기 때문에 커밋을 만들지 않았다는 Amber의 답변에 대한 귀하의 의견에서 들리므로 도움이되지 않습니다.

어떻게 그 파이프 작업에 관해서는 : git ls-files -zgit diff --name-only --diff-filter=D -z모두 출력 파일 이름 목록은 바이트로 구분 0. (이것은 줄 바꿈과 달리 0바이트가 유닉스 계열 시스템의 파일 이름에서 발생하지 않기 때문에 유용 합니다.) 프로그램 xargs은 기본적으로 표준 입력에서 행을 가져 와서 끝에 추가하여 표준 입력에서 명령 행을 작성 합니다. 명령 줄 -0옵션은 표준 입력이 0바이트 로 구분되어 있다고 말합니다 . xargs표준 입력에서 모든 매개 변수를 사용하기 위해 명령을 여러 번 호출하여 명령 행이 너무 길어지지 않도록하십시오.

간단한 예로, test.txt다음과 같은 파일을 가진 파일이있는 경우 :

hello
goodbye
hello again

... 그러면 명령 xargs echo whatever < test.txt명령 을 호출합니다.

echo whatever hello goodbye hello again

모든 변경 사항을 취소하려면 아래 명령을 사용하십시오.

git reset --soft HEAD

변경 사항을 스테이지 해제하고 작업 디렉토리에서 되돌리려면,

git reset --hard HEAD

참고 URL : https://stackoverflow.com/questions/7103631/how-to-unstage-large-number-of-files-without-deleting-the-content



반응형