programing

콘텐츠를 삭제하지 않고 많은 수의 파일을 분할하는 방법

yellowcard 2023. 5. 5. 08:47
반응형

콘텐츠를 삭제하지 않고 많은 수의 파일을 분할하는 방법

다음을 사용하여 실수로 많은 임시 파일을 추가했습니다.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.

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

기본 레포가 있는 경우(또는 HEAD가 [1]설정되지 않은 경우) 간단히

rm .git/index

물론 추가하려는 파일을 다시 추가해야 합니다.


[1] 참고(댓글에 설명된 바와 같이) 이 문제는 일반적으로 레포가 새것("prisstine")이거나 커밋이 수행되지 않은 경우에만 발생합니다.좀 더 엄밀히 말하면, 체크아웃이나 작업 트리가 없을 때마다.

좀 더 분명히 해둘 뿐입니다 :)

사용하다git reset HEAD수 (에는 파을제않재인다니합정설를인을 사용할 수 있습니다.)git reset HEAD -- /path/to/file이를 위해.)

파이프 오퍼레이터는 셸에서 다음을 가져갑니다.stdout왼쪽에 있는 프로세스의 다음과 같이 전달합니다.stdin오른쪽 프로세스로 이동합니다.기본적으로 다음과 같습니다.

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

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

2019년 업데이트

관련 질문(여기, 여기, 여기, 여기, 여기, 여기, 여기 여기 참조)에서 다른 사람이 지적했듯이 이제 다음을 사용하여 파일의 스테이징을 해제할 수 있습니다.git restore --staged <file>.

프로젝트에 있는 모든 파일의 스테이징을 해제하려면 리포지토리의 루트에서 다음을 실행합니다(명령은 재귀적임).

git restore --staged .

디렉터리에 있는 파일의 스테이징을 해제하려면 위를 실행하기 전에 디렉터리로 이동하거나 다음을 실행하십시오.

git restore --staged <directory-path>

메모들

  • git restore2019년 7월에 소개되었으며 버전 2.23에 출시되었습니다.
    --stagedflag, 트리의 합니다(그래서 ).git add변경 사항을 삭제하지 않습니다.)

  • 이 명령은 새 명령이지만 이전 명령의 동작은 변경되지 않습니다.은 서나이사람은들든래로 대답합니다.git reset또는git reset HEAD여전히 완벽하게 유효합니다.

  • 을 할 때git status준비된 커밋되지 않은 파일과 함께, 이것은 이제 Git가 (대신) 준비되지 않은 파일을 사용하기 위해 제안하는 것입니다.git reset HEAD <file>v2.23 이전 하게 됩니다.

git stash && git stash pop

되지 않은 HEAD를 그냥 .git 를 할 .

git rm -rf --cached .

모든 것을 해체하기 위해.이것은 사실상 Shehe의 솔루션과 동일하지만 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-filesGit가 알고 있는 모든 파일을 나열합니다. »-z특정 하는데, 이은 그에게형부다니과합예, 형니다식입는되상특들로 예상되는 형식입니다.xargs -0그리고 나서 그것은 발동합니다.rm -f승인 여부를 확인하지 않고 제거할 수 있습니다.

즉, "git가 알고 있는 모든 파일을 나열하고 로컬 복사본을 제거합니다."

나서 는 그면우는리러에 합니다.git diff그것은 Git이 알고 있는 다른 버전의 항목들 사이의 변화를 보여줍니다.이러한 변경 사항은 서로 다른 트리 간의 변경 사항, 로컬 복사본과 원격 복사본 간의 차이 등일 수 있습니다.
여기서 사용하는 것처럼 변경했지만 아직 커밋하지 않은 파일인 준비되지 않은 변경 사항이 표시됩니다. »--name-only만 원하는 이고 (전체) 파일 이름은 (으)로 표시됩니다.--diff-filter=D삭제된 파일에만 관심이 있음을 의미합니다.(이봐요, 우리가 방금 많은 것들을 삭제하지 않았나요?)그런 다음 이것은 파이프로 연결됩니다.xargs -0우리가 전에 본 적이 있는데, 그것은 유발합니다.git rm --cached즉, 캐시에서 제거되는 반면 작업 트리는 그대로 두어야 합니다. 단, 작업 트리에서 모든 파일을 제거한 경우는 예외입니다.이제 인덱스에서도 제거됩니다.

즉, 단계별 또는 단계별 변경사항이 모두 사라지고 작업 트리가 비어 있습니다.호출을 하고 원본 또는 원격에서 새로 파일을 체크아웃한 후 작업을 다시 수행합니다.이 극악무도한 대사를 쓴 새디스트를 저주하십시오. 저는 왜 누군가가 이것을 하고 싶어하는지 전혀 모르겠습니다.


을 호스트했습니다. 하고 TL을 사용합니다.DR: 방금 모든 것을 호스트했습니다. 다시 시작하여 사용하십시오.git reset지금부터

유감스럽게도 이러한 명령줄 중 첫 번째 명령줄은 작업 복사본에서 무조건 삭제되어 git의 준비 영역에 있는 모든 파일이 복사됩니다.두 번째 파일은 추적되었지만 지금은 삭제된 모든 파일의 스테이징을 해제했습니다.유감스럽게도 이는 해당 파일에 대한 커밋되지 않은 수정 사항이 손실됨을 의미합니다.

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

git reset --hard

나는 "조심스럽게"라고 말합니다.git reset --hard 작업 복사본색인에서 커밋되지 않은 변경 사항을 제거합니다.그러나 이 상황에서는 마지막 약속을 할 때 상태로 돌아가기를 원하는 것처럼 들리며, 약속되지 않은 변경 사항은 어쨌든 손실되었습니다.

업데이트: 앰버의 답변에 대한 귀하의 의견을 보면 (헤드를 해결할 수 없기 때문에) 아직 커밋을 만들지 않은 것처럼 들리기 때문에 도움이 되지 않을 것 같습니다.

작동 는 다음과 같이 설명합니다.git ls-files -z그리고.git diff --name-only --diff-filter=D -z 다 합니다.0(이것은 새로운 라인과 달리 유용합니다.0바이트는 유닉스 계열 시스템의 파일 이름에서 발생하지 않도록 보장됩니다.) 프로그램은xargs기본적으로 에서는 표준 입력에서 줄을 가져와 명령줄 끝에 추가하여 기본적으로 표준 입력에서 명령줄을 빌드합니다.-0을 입을력다구로 구분하여 로.0xargs명령을 여러 번 호출하여 표준 입력의 모든 매개 변수를 사용하여 명령줄이 너무 길어지지 않도록 할 수 있습니다.

예로 간한예다같음파있는경우라는 ,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

반응형