디스크에서 이미 삭제 된 Git 저장소에서 여러 파일 제거


1311

Git 리포지토리를 사용하여 rm( not git rm ) 을 사용하여 4 개의 파일을 삭제 했으며 Git 상태는 다음과 같습니다.

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

수동으로 다음과 같이 각 파일을 추가하지 않고 Git에서 이러한 파일을 어떻게 제거합니까?

git rm file1 file2 file3 file4

이상적으로 git add .는 가능한 경우 와 동일한 방식으로 작동하는 것을 찾고 있습니다.



10
@ seth, 항상 사용하는 것이 편리하지는 않지만 git rm별도의 도구, IDE 또는 파일 관리자에서 제거되었을 수 있습니다. Visual Studio는 파일을 제거하거나 이름을 바꿀 때 어려움을 겪을 수 있습니다.
Brett Ryan

67
헉, 사람이하는 질문 왜 안 사용은 git rm그들이 사용하지 않는 이유를 묻는 같은 비트입니다 git vim또는 git cd. 그것은 어리석은 일이며, git은 스테이징에서 삭제 된 파일을 제거하기 위해 내장 명령 또는 별칭을 가져야하며 SO에서 찾거나 점심 시간에 매뉴얼 페이지를 읽을 필요가 없습니다.
WCWedin

7
Varinder의 답변은 좋은 방법이 아닙니다. Cody가 제안한 git add -u를 고려하고이 질문에 대한 답변이기도합니다. stackoverflow.com/questions/1402776/…
Roland

답변:


2300

힘내 1.x

$ git add -u

이것은 git에게 이전에 추적 된 파일 삭제를 포함하여 추적 된 파일을 자동으로 스테이징하도록 지시합니다.

힘내 2.0

전체 작업 트리를 준비하려면 :

$ git add -u :/

현재 경로 만 준비하려면 :

$ git add -u .

133
이렇게하면 변경되고 추적 된 모든 파일이 삭제 및 업데이트됩니다.
이안 헌터

19
@beanland, 수정하려는 특정 파일에 대한 경로 만 제공하면됩니다. 예 : git add -u [path]
Paul Prewett

27
또한 git add -u folder/이 작업을 폴더에서 실행하려면
c ..

2
참고 :이 답변은 stackoverflow.com/questions/1402776/… 에서 병합되었습니다.
Shog9

1
사람들이이 페이지에 도착했을 때 묻는 질문 일 수도 있고 OP가 실제로 요청한 내용 일 수도 있지만 정확한 질문에 대한 답변은 아닙니다.
요청

1362
git ls-files --deleted -z | xargs -0 git rm 

당신이 찾고있는 것일 수도 있습니다 .. 그것은 나를 위해 작동합니다 ..


5
Windows의 경우 Evan Moran이 위에서 언급 한대로 인용 부호없이 구성에 다음 별명을 추가하십시오. 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS

21
공백이있는 파일 이름에주의하십시오
maazza

44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
최대 Nanasy

15
Cody가 제안한대로 git add -u는 훨씬 간단하고 안전한 방법이며 실수로 파일을 삭제할 위험이 없습니다.
Roland

4
일부 파일에서 작동하더라도 잘못된 대답이므로 이것을 다운 보트하십시오. 아래의 "git add -u"를 사용하십시오. 그게 다야.
n13

733

당신이 사용할 수있는

git add -u

삭제 된 파일을 준비 영역에 추가하려면 커밋

git commit -m "Deleted files manually"

100
참고 : Google 사용자 : 수정 된 추적 파일을 준비 영역에도 추가합니다.
erenon

4
파일을 방금 제거한 후 즉시 스테이징하려는 경우에만이 명령을 실행하십시오.
Aryo

1
난의 bitbucket의 repo]에서 파일을 제거 할 수 아니다
스 리니 바스 gowda

356

당신이 단순히 실행하는 경우 :

git add -u

git은 인덱스를 업데이트하여 삭제 한 파일이 실제로 다음 커밋의 일부임을 알아야합니다. 그런 다음 "git commit"을 실행하여 해당 변경 사항을 체크인 할 수 있습니다.

또는 다음을 실행하는 경우 :

git commit -a

이러한 변경 사항 및 기타 변경 사항이 자동으로 적용되어 커밋됩니다.

업데이트 : 삭제 된 파일 만 추가하려면 다음을 시도하십시오.

git ls-files --deleted -z | xargs -0 git rm
git commit

1
그래, git commit -a내가 커밋 싶지 않아 내가 수동 커밋을 준비 할 수 있도록 어떤 경우에는 내가 파일을 제외하고 내가 원하는 것을 할 것입니다.
Igor Zevaka

2
commit -a는 기본적으로 "add -u"를 먼저 수행합니다. 알려진 파일에 대한 변경 사항 (삭제 또는 간단한 변경)으로 색인을 업데이트합니다. 물론 더 구체적이고 원하는 파일 만 추가 / rm 할 수 있습니다. git.or.cz/gitwiki/… 가 도움이 될 수 있습니다.
Emil 앉아

2
"Update : .."아래의 명령 세트는 매력처럼 작동했습니다. 감사!
Jay Taylor

10
'git ls-files --deleted | xargs git rm '!
mit

18
"git ls-files --deleted | xargs git rm"이 정답입니다! 감사!
reto

166

당신은 아마 -A를 찾고있을 것입니다 :

git add -A

이것은 git add -u와 유사하지만 새 파일도 추가합니다. 이것은 hg의 addremove명령 과 거의 같습니다 (이동 감지는 자동이지만).


8
간단한 참고로, -u를 사용하면 추적 된 파일에 추가가 제한되고 -a는 추적되지 않은 파일도 포함합니다. 차이점을 지적하겠다고 생각했습니다.
spaaarky21

이 단계에서 commit -a 플래그를 통해 모든 것을 추가 할 수도 있습니다.
Zac Grierson

94

삭제 된 파일 준비하려면 :

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

또는 (xargs 방식) :

git status | awk '/deleted/ {print $2}' | xargs git rm

나중에 사용하기 위해 선호하는 명령 세트의 별명을 지정할 수 있습니다 .


2
@Saeb 대기열에 대해 이해하지만 xargs마스터하는 데 약 15 분이 걸립니다.
Eric Wilson

11
git status | awk '/deleted/ {print $3}' | xargs git rm더 짧은 방법이 될 것입니다. grep | awk... 그냥 말해 아니오
마크 리드

58
git rm $(git ls-files --deleted)(복사이 더 편리하지 않습니다 ).
Hotschke

1
목록이 크지 않다면 xargs 또는 위의 $ () 대체. 목록 크면 : git ls-files --deleted | while read f; do git rm $f; done
Andrew

2
@Andrew xargs는 실행 시마다 하나 이상의 인수를 전달하기 때문에 거대한 목록의 while 루프보다 더 효율적일 것 git rm입니다. git rm실행될 때마다 전달되는 인수 수를 제한하려면 다음 -n옵션을 사용하십시오 .git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

실제 파일을 삭제하기 전 또는 후에


7
그것이 작동하는 동안, 나는 종종 많은 파일을 삭제하고 rm나중에 유감스럽게 생각합니다.
carl

4
왜 이것보다 나쁜 git add -u가요? 모든 변경 사항을 추가하는 대신 커밋에 삭제 된 특정 파일을 추가하는 것이 더 안전 해 보입니다 .
Ian Dunn

2
실제로 이것은 질문의 마지막 줄에 따르면 가장 좋은 대답이어야합니다. "디스크에서 삭제 된 git의 모든 파일을 삭제하는 명령을 원합니다."
Ramsharan

2
@Ramsharan 아니오, 전혀하지 않기 때문입니다. 단일 파일이 삭제됩니다. OP가 특별히 "모두"삭제 된 파일을 요청했습니다.
Adam

1
@Ramsharan 아니오, 요점입니다. 거의 모든 경우에 와일드 카드를 사용할 수 없습니다 (일치하는 와일드 카드는 없습니다). 이것이 주된 대답이 훨씬 더 복잡한 이유입니다.
Adam

49

'--all'또는 '--update'옵션과 함께 git-add를 사용하면 원하는 것보다 많은 것을 얻을 수 있습니다. 새 파일 및 / 또는 수정 된 파일도 색인에 추가됩니다. 다른 파일을 건드리지 않고 git에서 삭제 된 파일을 제거하려고 할 때 bash 별칭 설정이 있습니다.

alias grma='git ls-files --deleted -z | xargs -0 git rm'

파일 시스템에서 제거 된 모든 파일이 삭제 될 때 색인에 추가됩니다.


39

실제로 중요하지는 않지만 선택한 답변에 동의하지 않습니다.

git add -u 

... 작업 트리의 해당 파일이 제거 된 경우 색인에서 파일을 제거하지만 추적 된 파일의 수정 된 새 내용도 준비합니다.

git rm $(git ls-files --deleted)

반면에 ... 추적 된 삭제 된 파일 만 rm합니다.

내 관점에서 후자가 더 나은 옵션입니다.


29

이것이 유일한 변경 사항이라면 간단하게 할 수 있습니다.

git commit -a

모든 변경 사항을 커밋합니다. 삭제 된 파일이 포함됩니다.


3
내가 투표를 한 이유를 잘 모르겠습니다. git은 git rm을 사용하여 명시 적으로 말하지 않았더라도 삭제 된 파일을 식별하는 데 효과적입니다.
SpoonMeiser

"-a"는 허용 가능한 스위치가 아니기 때문에 "-A"입니다. 답변 수정.
Sheharyar 2019

10
명령이 commit 이므로 "-a" 허용 가능한 스위치 입니다. "-A"는 추가 하지만 커밋 하지 않는 스위치 입니다. 제안한 수정 사항이 이미 거부 된 것으로 보입니다.
SpoonMeiser

커밋하는 유일한 파일이 삭제 된 파일 인 경우 스위치 --allow-empty
billrichards

당신이 자식 RM은 --cached 않은 경우 ERR, 실제로 --allow-빈에만 필요합니다
billrichards

20
git ls-files --deleted | xargs git rm 

삭제 된 파일 만 추가하는 가장 좋은 옵션입니다.

다른 옵션이 있습니다.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.

16

자식 추가 -u

-u --update 작업 트리가 아니라 인덱스에서 이미 추적 된 파일과 만 일치합니다. 즉, 새 파일을 스테이징하지 않지만 추적 된 파일의 수정 된 새 컨텐츠를 스테이징하고 작업 트리의 해당 파일이 제거 된 경우 색인에서 파일을 제거합니다.

지정하지 않으면 기본값은 "."입니다. 즉, 현재 디렉토리 및 해당 서브 디렉토리에서 추적 된 모든 파일을 업데이트하십시오.


최고 투표 답변은 이미 사용한다고 말합니다 git add -u. 귀하의 답변에서 다른 모든 것들은 어디에서 왔습니까? 설명서에 링크하여 인용문을 인용하십시오.
TheWarriorNamedFoo

14

그 간단한 솔루션은 저에게 잘 작동합니다.

git rm $(git ls-files --deleted)

나는 항상 현재 작업 디렉토리에서 git shell을 사용해야한다고 생각합니다.
Houssem Badri

2
이것은 훌륭하고 간단하지만 재귀 폴더에서는 작동하지 않습니다.
DrB

@BehnazChangizi 나는 그것이 않습니다 생각 stackoverflow.com/questions/1054044/...
Houssem 바드

@PvdL 경로에서 허용되지 않는 공간은 os-specefic 문제입니다
Houssem Badri

11

추가하려면 다음을 .gitconfig수행하십시오.

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

그런 다음 실행해야합니다.

git rma

1
cmd 라인에서git config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey

9
git ls-files --deleted -z | xargs -0 git rm --cached

이것은 git에 의해 이전에 추적 된 모든 삭제 된 파일을 제거하고 파일 이름에 공백이있는 경우를 처리합니다.

POSIX 변형에 따라 사용해야 할 수도 xargs -0 -r있습니다.xargs 정상적으로 종료 파이프 널 내용.

편집 : --cached--deleted플래그는 함께 삭제되지 않은 파일을 실수로 삭제하지 않도록 보호하는 데 사용됩니다.


7

수정 및 삭제 된 파일을 자동으로 스테이징하도록 명령에 지시하지만 Git에 알리지 않은 새 파일은 영향을받지 않습니다.

-a
--all

git add . && git commit -m -a "Your commit"

또는

git add --all && git commit -m "Your commit"

1
git add --all && git commit -m "Your commit"이것은 Git bash 명령 쉘을 사용하여 Windows-7에서 작동했습니다.
kmarabet

1
다음 명령은 망할 놈의 bash는 명령 쉘을 사용하여 윈도우 7에 나를 위해 일한 : $가 추가 GIT --all && 자식 "제거 등록 정보 파일"-m 커밋 한 파일이 변경 [마스터 58c41ac] 제거 등록 정보 파일, 9 삭제를 (-). .. 그런 다음 커밋 된 변경 사항을 원격 저장소에 푸시하려면 다음을 실행하십시오. $ git push origin .. 개체 수 계산 : 10, 완료.
kmarabet

6

처리 할 파일이 많은 경우에도 다음이 작동합니다.

git ls-files --deleted | xargs git rm

당신은 또한 주석으로 커밋하고 싶을 것이다.

자세한 내용은 유용한 Git 스크립트를 참조하십시오.


6

사용하시기 바랍니다 -t 실제로으로 실행되고있는 명령을 볼 수

방금 Virender 답변을 조정하여 동일한 작업을 수행했습니다.

git ls-files --deleted -z | xargs -t -0 git rm

5

git-add 플래그는 제거 된 파일 만 스테이징하지 않습니다. 수정 한 모든 파일이 삭제 된 파일이라면 괜찮습니다. 그렇지 않으면 git-status를 실행하고 출력을 구문 분석해야합니다.

제레미의 대답에서 벗어나서, 이것이 내가 얻은 것입니다.

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. 파일 상태를 가져옵니다.
  2. 삭제 된 파일의 경우 파일 이름을 분리하십시오.
  3. #으로 시작하는 모든 줄과 "deleted"라는 단어가있는 상태 줄을 모두 제거합니다. 정확히 무엇인지 기억하지 못하고 더 이상 존재하지 않으므로 다른 상황에 맞게 수정해야 할 수도 있습니다. 표현식 그룹화는 GNU 고유의 기능 일 수 있으므로 gnutils를 사용하지 않는 경우 여러 grep -v줄 을 추가해야 할 수도 있습니다 .
  4. 에 파일을 전달하십시오 git rm.

쉘 별명에 이것을 고집하십시오 ...


5

말한 바와 같이

git add -u

삭제를 위해 삭제 된 파일을 준비하지만 업데이트를 위해 수정 된 파일도 준비합니다.

수정 된 파일을 스테이지 해제하려면 다음을 수행하십시오.

git reset HEAD <path>

커밋을 정리하고 깨끗하게 유지하려면
참고 : 삭제 된 파일의 스테이지를 해제 할 수도 있으므로 해당 와일드 카드에주의하십시오.


4
git commit -m 'commit msg' $(git ls-files --deleted)

이미 파일을 삭제 한 후에 이것은 나를 위해 일했습니다.


3

나는 git gui "stage changed"버튼을 필요로했다. 또한 모두 추가합니다.

그리고 "무대 변경"후에 나는 "커밋"했습니다 ...

작업 디렉토리가 다시 깨끗해졌습니다.


잘 GUI를 사용하면 CHEATING, lol! 그러나 GUI 디자이너가 귀하의 요구를 충족시킨 경우 더 빠릅니다. '무엇이 밑에 있는지'로 어설프게하는 방법을 아는 것이 좋습니다.
Dennis


3
git rm $(git ls-files -d)

git ls-files명령으로 나열된 모든 파일을 제거합니다 (-d는 삭제 된 파일 만 표시). 파일 이름이나 경로에 공백이있는 파일에서는 작동하지 않지만 기억하기 쉽습니다.


2

당신이 사용할 수있는 git add -u <filenames>삭제 된 파일 만 준비하는 데 .

예를 들어 파일을 삭제 templates/*.tpl한 경우git add -u templates/*.tpl .

-u저장소에 존재하지 않는하지만 작업 디렉토리에 존재하는 더 이상 파일을 참조하기 위해 필요합니다. 그렇지 않으면 기본값은 git add작업 디렉토리에서 파일을 찾는 것입니다. 삭제 한 파일을 지정하면 찾을 수 없습니다.


2

삭제 된 파일을 스테이징하기위한 시스템 별명을 명령으로 추가 rm-all

유닉스 alias rm-all='git rm $(git ls-files --deleted)'

WINDOWS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

노트

Windows가 bash설치되어 있어야합니다.


2

(아직 다른 변형)

디스크 파일에서 하나의 특정 폴더에서 이미 삭제 된 모든 파일을 삭제하고 다른 폴더는 그대로 두었습니다. 다음은 나를 위해 일했습니다.

git ls-files --deleted  | grep <folder-name> | xargs git rm

1

같은

git status | sed -s "s/^.*deleted: //" | xargs git rm 

할 수 있습니다.


2019 git version 2.13.3 :git diff --diff-filter=D --name-only | xargs git rm
user151841

1

비주얼 스튜디오 프로젝트

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

삭제 된 파일 경로에 공간이있을 때 유용합니다


-1

내가 지금까지 찾은 가장 유연한 솔루션은

git cola

그리고 스테이지하려는 삭제 된 파일을 모두 선택하십시오.

(참고로 나는 일반적으로 git에서 모든 명령 줄을 수행하지만 git은 제거 된 파일을 약간 어색하게 처리합니다.)


와일드 카드가 나와 함께 작동하지 않았 git add -u path/to/my/deleted-files-pattern-*.yml으므로 이것이 최선의 대답이었습니다 (삭제 된 모든 파일을 준비하고 싶지 않지만 수백 개 중 50 개).
mlncn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.