Git 리포지토리에서 여러 개의 삭제 된 파일을 제거하는 방법


236

일부 파일을 삭제했으며 아래와 같이 자식 상태가 표시됩니다.

나는 커밋하고 추진했다.

GitHub는 여전히 저장소에서 삭제 된 파일을 표시합니다. GitHub 리포지토리에서 파일을 어떻게 삭제합니까?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

를 사용 git rm하면 다음을 제공합니다.

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched


답변:


637
git add -u 

모든 변경 사항을 업데이트합니다


31
매력을 발휘합니다. "git status | sed -n '/ ^ # * deleted : / s /// p'| xargs git rm"과 같은 간단하고 빈번한 요구 사항에 대한 제안 된 솔루션으로 볼 때 더 나은 해결책은 다음과 같습니다. 또는 곧 모퉁이를 돌 것입니다.
arcseldon

간단합니다.이 방법은 "bash"방식보다 훨씬 편리합니다.
castiel

1
작성자가 파일을 제거하는 방법을 묻습니다. 왜 파일을 추가하는 것이 정답입니까?
킬린

3
@kelin : git docs ( git-scm.com/docs/git-add ) : "-u --update <pathspec>과 일치하는 항목이있는 위치에서 색인을 업데이트합니다. -u 옵션을 사용할 때 <pathspec>을 지정하지 않으면 전체 작업 트리에서 추적 된 모든 파일이 업데이트됩니다 (이전 버전의 Git은 현재 디렉토리로 업데이트를 제한합니다. 하위 디렉토리). "
HEDMON

92

매우 조심하십시오 git rm .; 원하는 것보다 더 많이 제거 할 수 있습니다. 물론 복구 할 수는 있지만 복구 할 필요는 없습니다.

가장 간단한 방법은 다음과 같습니다.

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

파일이 존재하지 않기 때문에 쉘 와일드 카드를 사용할 수는 없지만 적어도 Bash에서 사용할 수 있습니다.

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

또는 다음을 고려하십시오.

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

이것은의 출력을 취하고 git status기본적으로 아무것도 인쇄하지 않지만 ( sed -n) 시작하는 행 # deleted:에서는를 제거 #하고 deleted:남은 것을 인쇄합니다. xargs인수를 모아서 git rm명령에 제공합니다 . 이름의 유사성 (또는 비 유사성)에 관계없이 여러 파일에 적용됩니다.


6
당신은 할 수 있습니다 (당신이 그들을 탈출 할 수 있지만) 와일드 카드를 사용, 그것은 중요하지가 파일 시스템에 존재하지 않는 않도록 자식이 아니라 그 작업 트리에서 색인에 경로를 일치합니다.
벤 제임스

109
git diff --diff-filter=D --name-only -z | xargs -0 git rmgit status사용자 지향적이고 향후 버전에서 안정적으로 보장되지 않는 구문 분석 을 시도하는 것보다 더 안정적인 방법 입니다.
CB Bailey

@Charles : 그것은 확실히 더 좋지만, 어떤 옵션을 사용할 수 있는지에 대한 많은 지식 git diff이 필요합니다 (이전에는 필요하지 않았지만). 감사!
Jonathan Leffler

8
참고도 있다는 것을 "자식 LS-파일 --deleted"
페트르 Gladkikh에게

1
그래서, git ls-files --deleted | xargs git rm나를 위해 트릭을했다.
fiacobelli

50

ByScripts 답변의 다른 버전은

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

이것은 git에서 삭제 된 파일 만 제거합니다.

수정 된 파일 만 추가 할 때도 사용할 수 있습니다.

git add $(git ls-files --modified)

이 명령은 Windows 용 gitbash에서도 작동합니다.


2
git ls-files이없는 상태는 삭제 또는 수정 된 상태이므로 매우 유용합니다.
Mario Peshev

1
'git add --update (or -u)'트리의 하위 디렉토리에서 경로 인수가없는 동작은 Git 2.0에서 변경되므로 더 이상 사용해서는 안됩니다. 전체 트리의 내용을 추가하려면 다음을 실행하십시오. git add --update :/ (또는 git add -u : /) 명령을 현재 디렉토리로 제한하려면 다음을 실행하십시오. git add --update . (또는 git add -u) 현재 디렉토리
Ans

1
공백이있는 경로를 처리하는 방법을 알고 있습니까? 예 : src/my spaced directory/myfile. 이것은 개별적으로 처리 할 수 ​​있지만이 대답의 명령을 사용하여 어떻게 처리 할 수 ​​있습니까?
Muhammad Gelbana 2016 년

35

변경 사항을 모두 업데이트하십시오.

git add -u

삭제 된 파일은 준비되지 않은 (보통 빨간색)에서 준비된 (녹색)으로 변경되어야합니다. 그런 다음 삭제 된 파일을 제거합니다.

git commit -m "note"

1
포퓰리스트 배지가 필요합니다.
John

1
이것이 지금까지 가장 좋은 솔루션입니다. 스크립팅 해킹, 긴 프로세스, git에게 인덱스를 완전히 업데이트하도록 지시하는 플래그가 없습니다.
Ron Dahlgren

훌륭한! 20 개 이상의 파일 경로를 입력하지 않아도됩니다. 감사!
allardbrain

12

수정 된 파일 준비에 신경 쓰지 않는 가장 좋은 솔루션은 mshameers 및 / 또는 pb2q에서git add -u 말한대로 사용 하는 입니다.

삭제 된 파일을 제거하고 수정 된 파일을 준비하지 않으 ls-files려면 --deleted옵션 과 함께 인수 를 사용해야한다고 생각합니다 (regex 또는 다른 복잡한 인수 / 옵션을 사용할 필요가 없습니다).

git ls-files --deleted | xargs git rm

1
git add -A미래에 누군가가 알고 싶어하는 경우에 대비하여이 문제를 해결합니다. 아래 답변을 확인하십시오
Ja8zyjits

8

예, git rm <filename>파일의 삭제 된 상태를 준비합니다. 여기서 <filename>glob 패턴이 될 수 있습니다.

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

그러면 커밋 할 수 있습니다.

git commit -a 원하는 경우 한 번에이 작업을 수행합니다.

당신은 또한 사용할 수 있습니다 git add -u다음, 모든 삭제 된 파일을 포함하여 모든 변경 사항을, 무대 커밋.


그래서 rm. 한 번에 삭제 하시겠습니까?

그래서 git rm이 한 번에 모두 제거됩니까?

1
glob 스타일 패턴을 사용하여 여러 파일을 제거 할 수 있습니다. 예를 보여주기 위해 답변을 업데이트했습니다.
벤 제임스

5
그것은 git add -u우리가 찾고있는 것 같습니다 -많은 삭제를 한 다음 모든 삭제를 커밋하려면 가장 쉽고 가장 표준적인 방법 인 것처럼 보입니다 (즉, 대 / 소문자 구분없이 복잡한 쉘 구문 분석을 의미하지 않음) xargs). 모든 변경 사항을 한 번에 추가한다는 사실 외에는 이것을 사용하고 싶지 않은 이유가 있습니까?
trisweb

7

커밋을 위해 준비되지 않은 파일을 많이 삭제하면 다음 git rm과 같이 한 번에 모두 표시 할 수 있습니다.

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

질문 답변자가 언급했듯이에주의하십시오 git rm.



3

당신이 사용할 수있는

git commit -m "remove files" -a
git push

파일을 수동으로 삭제 한 후


1
또는 동일하지만 간결하게 : git commit
-am

3

실행할 때 모든 파일을 제거하는 쉘 스크립트를 작성할 수 있습니다.

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

생성 된 스크립트 remove.sh는 전체 git rm명령 목록을 포함 합니다.


2
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf


2

"git rm"을 사용하여 모든 파일을 삭제하려면 이것이 제가하는 것입니다:

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

이 쿼리는 제거 된 모든 파일을 나열하고 git 저장소에서 삭제합니다. 도움이 되길 바랍니다.


1

내장 클린 기능도 도움이 될 수 있습니다 ...

git clean -fd

1
이것은 추적되지 않은 파일에만 적용됩니다.
Elijah Lynn

1

삭제 한 후이 깔끔한 명령을 겪은 후에이 유령 파일이 내 저장소에 나타납니다!

git add -A

본질적으로 동일 git add -a하고 git add -u결합되어 있지만 대소 문자를 구분합니다. 이 멋진 링크 에서 얻었습니다 (이 링크는 현재 archive.org의 버전을 가리 킵니다. 원본은 2016 년 6 월 현재 스팸 / 피싱 페이지로 변환 되었기 때문입니다)


0

삭제 된 파일을 감지하고 다음 커밋의 일부로 삭제를 준비하는 방법은 다음과 같습니다. 이 스레드의 모든 솔루션에는 다른 장점이 있습니다. 이 솔루션은 특히 공백이있는 파일 이름 문제를 처리합니다.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

다음과 같이 실행하기 전에 git의 --dry-run 옵션으로 이것을 테스트하십시오.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

설명:

git status --porcelain

경로 이름에 공백이있을 때만 발생하는 D "/ 폴더 경로 / 파일 경로"와 같은 것을 인쇄합니다.

awk '/^.D .*$/ {print $0}'

"D"로 시작하는 줄만 일치

sed 's/ D \(.*\)/\1/'

각 줄의 앞면에서 "D"를 제거

tr -d '"'

따옴표를 제거하십시오

xargs -I {} git rm '{}'

공백이있는 파일 이름을 지원하도록 작은 따옴표로 묶은 git rm 아래에서 파일 이름 변수를 {} 실행 파일 이름으로 정의하십시오.

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