Git 리포지토리에서 파일을 어떻게 삭제합니까?


1922

"file1.txt"Git 저장소에 파일을 추가했습니다 . 그 후, 나는 그것을 최선을 다하고라는 디렉토리의 몇 가지 추가 dir1등을 dir2하고 Git 저장소로 최선을 다하고 있습니다.

지금 현재의 저장소가 "file1.txt", dir1그리고 dir2. 어떻게 삭제할 수 있습니다 "file1.txt"처럼 다른 사람에 영향을주지 않고 dir1하고 dir2?


85
git rm정답이지만 파일은 여전히 ​​기록에 있습니다. 민감한 정보가 포함되어있는 파일을 제거하려면보다 과감한 작업을 수행해야합니다. (특히 이미 푸시 한 콘텐츠에 대한 기록 변경은 과감한 조치이므로 가능하면 피해야합니다.)
Keith Thompson

8
참고 : GitHub에서 웹 인터페이스에서 파일을 직접 삭제할 수 있습니다 (리포지토리 복제조차 필요 없음). 아래 내 답변을 참조하십시오 .
VonC

4
@KeithThompson 필사적으로 그렇게하고 싶다면 어떤 단계가 될 수 있습니까?
lessthanl0l 2019


답변:


3219

사용하십시오 git rm.

Git 저장소 와 파일 시스템 에서 파일을 제거 하려면 다음을 사용하십시오.

git rm file1.txt
git commit -m "remove file1.txt"

그러나 Git 저장소에서만 파일을 제거하고 파일 시스템에서 제거하지 않으려면 다음을 사용하십시오.

git rm --cached file1.txt
git commit -m "remove file1.txt"

그리고 변경 사항을 원격 저장소로 푸시

git push origin branch_name  

92
또한 편리합니다 : git rm -r directory // 디렉토리와 내용을 제거하려면
Reg

10
그래도 다른 커밋에서 해당 파일을 제거하지는 않습니다.
VaTo

6
@SaulOrtega : 맞습니다. 이전 커밋에서 파일을 제거하려면 (과거 기록 변경) 민감한 데이터 제거 에 대한 GitHub 도움말 페이지를 참조 하십시오 .
Greg Hewgill

15
파일도 로컬에서 삭제됩니다.
리포지토리

5
해당 파일에 민감한 정보 (예 : 자격 증명)가 포함 된 경우 해당 자격 증명을 즉시 변경 해야 합니다 . GitHub 를 인용하려면 " GitHub 에 커밋을 푸시 한 후에는 포함 된 모든 데이터가 손상된 것으로 간주해야합니다. 비밀번호를 커밋 한 경우 변경하십시오! 키를 커밋 한 경우 새 키를 생성하십시오."
c1moore

608

git rm file.txtrepo에서 파일을 제거하고 로컬 파일 시스템에서도 파일을 삭제합니다 .

저장소에서 파일을 제거하고 로컬 파일 시스템에서 파일을 삭제 하지 않으 려면 다음을 사용하십시오.
git rm --cached file.txt

아래 정확한 상황은 git을 사용하여 비즈니스 웹 사이트의 버전 제어를 유지하지만 "mickey"디렉토리는 개인 컨텐츠를 CAD 개발자와 공유하는 tmp 폴더였습니다. 그가 거대한 파일을 필요로 할 때, 나는 개인의 연결되지 않은 디렉토리를 만들고 브라우저를 통해 가져 오기 위해 파일을 ftpd했습니다. 내가 이것을 잊어 버린 후에 나중에 git add -A웹 사이트의 기본 디렉토리에서 수행했습니다 . 이어서 git status커밋이 필요한 새 파일을 보여주었습니다. 이제 자식 추적 및 버전 제어에서 삭제해야했습니다 ...

아래의 샘플 출력은 실수로 .003파일을 삭제 한 내게 발생한 결과 입니다. 고맙게도 로컬 사본에 발생한 일에 신경 쓰지 .003않지만 현재 변경된 다른 파일 중 일부는 웹 사이트에서 방금 업데이트 한 것으로 로컬 파일 시스템에서 삭제 된 서사시입니다! "로컬 파일 시스템"= 라이브 웹 사이트 (위대한 관행은 아니지만 현실입니다) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

업데이트 : 이 답변에 약간의 트래픽이 발생하므로 다른 Git 답변 에 몇 가지 훌륭한 리소스가 있음을 언급했다고 생각 합니다. 이 페이지 에는 Git을 이해하기 쉽게하는 그래픽이 있습니다. "프로 힘내"이 책은 온라인 과 나에게 많은 도움이됩니다.


6
그런 다음 이와 비슷한 것을 커밋 git commit -m "Just removing file1.txt"해야합니다. 원격 리포지토리가있는 경우 다음 과 같은 커밋을 푸시하십시오 git push origin master.
금지 지오 엔지니어링

77

먼저, git rm특히 여러 파일에을 사용하는 경우 git명령이 아닌 셸에서 와일드 카드를 확인하는 것을 고려하십시오 .

git rm -- *.anExtension
git commit -m "remove multiple files"

그러나 파일이 이미 GitHub에 있는 경우 (2013 년 7 월부터) 웹 GUI에서 직접 삭제할 수 있습니다!

저장소의 파일을보고 상단의 휴지통 아이콘을 클릭 한 다음 다른 웹 기반 편집과 마찬가지로 제거를 커밋하십시오.

그런 다음 git pull로컬 리포지토리에서 " "파일을 삭제하면 파일도 로컬로 삭제됩니다.
이 답변을 git repo에서 파일을 삭제하는 방법은 무엇입니까?
(GitHub의에 파일이 있음을 언급 할 필요가 없을 것입니다 는 "자식의 repo"에서)


삭제 버튼

(커밋은 해당 파일의 삭제를 반영합니다) :

삭제를 저 지르다

그런 식으로 사라졌습니다.

이러한 기능에 대한 도움말을 보려면 파일 작성 , 이동 , 이름 바꾸기삭제 에 대한 도움말을 읽으십시오 .

참고 : 버전 제어 시스템이므로 나중에 파일을 복구해야 할 경우 Git은 항상 등을 가지고 있습니다.

마지막 문장은 삭제 된 파일이 여전히 히스토리의 일부이므로 GitHub 웹 인터페이스를 통해 아직 충분히 복구 할 수는 없습니다.

" Git repo에서 삭제 된 파일 복원 "을 참조하십시오 .


4
하단으로 스크롤하여 "커밋 변경"을 눌러 삭제를 커밋해야합니다!
LevinsonTechnologies

1
큰 텍스트 파일에는 작동하지 않습니다. 서버는 스크린 샷과 같이 파일을 렌더링하려고 시도하고 500 오류와 함께 실패합니다.
CapeCoder

9
이 답변은 github에 관한 것이며, 질문은 git repo에 관한 것입니다. github 인터페이스를 사용하는 방법이 아닙니다.
피터 마샬

65

이것은 나를 위해 일한 유일한 옵션입니다.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

참고 : * .sql을 파일 이름 또는 파일 형식으로 바꾸십시오. 이것은 모든 커밋을 거치고이 파일 형식을 제거하기 때문에 매우주의하십시오.

편집 :주의하십시오-이 명령 후에는 밀거나 당길 수 없습니다-당신은 '관련되지 않은 기록'에 대한 거부를 볼 수 있습니다 'git push --force -u origin master'를 사용하여 밀거나 당길 수 있습니다


9
이것은 훌륭한 답변이지만 다른 답변과 달리이 명령은 커밋 기록을 다시 작성하고 패턴과 일치하는 모든 파일 추적을 제거합니다. 이것은 민감한 정보를 실수로 커밋 한 경우에 유용합니다 (필요한 경우 --force를 사용하여 원격 저장소의 기록을 다시 쓸 수 있음).
yoniLavi

3
그것은 내가 가진 문제였으며 제대로 이해하려면 약간의 시행 착오가 필요했습니다. 내가 함께 일한 사람은 많은 커밋을 통해 여러 개의 큰 데이터베이스 덤프를 리포지토리에 커밋했습니다. 그래서 내 예제에서 .sql을 사용했습니다. 내 저장소는 너무 부풀어 커져서 github가 더 이상 푸시를 허용하지 않을 것입니다.
Jason Glisson

3
원격 마스터를 사용하는 경우 커밋을 강제 실행하고 푸시해야합니다.git push --force -u origin master
AlbertMarkovski

2
@AlbertMarkovski 죄송합니다. 구체적이지 않았습니다. 저장소가 크기 제한을 초과했기 때문에 Github은 실제로 푸시를 허용하지 않습니다. 최소 몇 GB 그들은 나를 차단하고 그것에 대해 이메일을 보냈습니다. 불행히도, 그 시점에서 푸시를 강요하는 양이 도움이되지 않습니다.
Jason Glisson

2
@JasonGlisson 우연히 비디오가 저장소에 추가되는 문제에 직면했습니다.
AlbertMarkovski

34

또한 제거 할 폴더이고 후속 하위 폴더 또는 파일 인 경우 다음을 사용하십시오.

git rm -r foldername

2
로컬에서도 폴더가 제거됩니다! Use git rm --cached -r <foldername>
Axis

24

더 일반적으로 git help다음과 같은 간단한 질문에 도움이됩니다.

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

6
더 복잡한 것들은 git help혼란 스럽지만 간단한 것에는 좋습니다 :)
James Polley

9
"index"는 git noob에 익숙한 개념이 아니기 때문에 실제로 git noob에는 적합하지 않습니다. 나는 git noob이라는 개인적인 경험에서 말합니다 :) 또한 인덱스에서 제거 하기보다는 삭제를 rm 위해 파일 을 준비한다고 말하는 것이 훨씬 덜 혼란 스럽다고 생각합니다.
Roman Starkov

romkyns에 동의하기 : "작업 트리 및 색인에서 파일 제거"라는 설명이 파일을 저장소에서 제거하는 방법 인 것처럼 들리지 않습니다. 어쩌면 내가 더 잘 이해한다면 좋을 것입니다. 대신 파일을 스테이징하지 않는 것 같습니다 (선택적으로 작업 트리에서 파일을 제거하면
리포지토리에

14

리포지토리에서 파일을 삭제하지만 파일 시스템에 그대로 두려면 (추적되지 않음) :

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

repo 및 파일 시스템에서 파일을 삭제하려는 경우 다음 두 가지 옵션이 있습니다.

  1. 파일에 색인에서 준비된 변경 사항이없는 경우 :

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. 파일이 색인에서 단계적으로 변경된 경우 :

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm 지금부터는이 브랜치의 파일 만 제거하지만, 기록에 남아 있으며 git은이를 기억합니다.

git filter-branch다른 사람들이 여기에서 언급했듯이 올바른 방법은입니다 . 브랜치 히스토리에서 모든 커밋을 다시 작성하여 해당 파일을 삭제합니다.

그러나 그렇게 한 후에도 git은 reflog, remotes, tag 등에 참조가 있기 때문에 그것을 기억할 수 있습니다.

한 번에 완전히 제거하려면 사용하는 것이 좋습니다. git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

간단 git forget-blob file1.txt합니다.

이렇게하면 모든 참조가 제거 git filter-branch되고 마지막으로 git 가비지 수집기 git gc를 실행하여 리포지토리 에서이 파일을 완전히 제거합니다.


10

rm 명령을 사용하여 로컬 폴더에서 파일을 삭제 한 다음 변경 사항을 원격 서버로 푸시하려는 다른 방법입니다.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

참고 : git에서만 파일을 삭제하려면 아래를 사용하십시오.

git rm --cached file1.txt

하드 디스크에서도 삭제하려는 경우 :

git rm file1.txt

폴더를 제거하려면 (폴더에 파일이 거의 없을 수 있음) 다음과 같이 재귀 명령을 사용하여 제거해야합니다.

git rm -r foldername

다른 폴더 안의 폴더를 제거하려면

git rm -r parentFolder/childFolder

그런 다음, 당신은 할 수 commitpush평소. 그러나 삭제 된 폴더를 복구하려면 다음을 수행하십시오 .git에서 삭제 된 파일을 복구 할 수 있습니다.

문서에서 :

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

옵션

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

쉘 이스케이프해야 할 수도 있습니다. 디렉토리의 모든 파일과 재귀 적으로 모든 하위 디렉토리를 제거하기 위해 선행 디렉토리 이름 (예 : dir / file1 및 dir / file2를 제거하는 dir)을 지정할 수 있지만, -r 옵션을 명시 적으로 지정해야합니다. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

명령 줄 옵션). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

-무시 불일치

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

공식 문서에 대해 자세히 알아보십시오.


7

특정 파일을 삭제하려면

자식 rm 파일 이름

한 번에 디렉토리에서 추적되지 않은 모든 파일을 재귀 적으로 정리하려면

git clean -fdx


5

Windows 용 GitHub 애플리케이션이있는 경우 5 단계로 파일을 삭제할 수 있습니다.

  • 동기화를 클릭하십시오.
  • 파일이있는 디렉토리를 클릭하고 최신 버전의 파일을 선택하십시오.
  • 도구를 클릭하고 "여기에서 쉘 열기"를 선택하십시오.
  • 쉘에 "rm {filename}"을 입력하고 Enter를 누르십시오.
  • 변경 사항을 커밋하고 다시 동기화하십시오.

5

내 경우에는 커밋이 거의 없으면 github에서 파일을 제거하려고했지만 컴퓨터에 저장했습니다.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

나중에이 파일은 무시되었습니다.


3
  1. 먼저 로컬 저장소에서 파일을 제거하십시오.

    git rm -r 파일 이름

    또는 로컬 저장소에서만 파일 시스템에서 파일을 제거하십시오.

    git rm-캐시 된 파일 이름

  2. 둘째, 변경 사항을 로컬 저장소로 커밋합니다.

    git commit -m "unwanted files or some inline comments"   
    
  3. 마지막으로, 로컬 변경 사항을 원격 저장소로 업데이트 / 푸시하십시오.

    git push 
    

실수로 추가하고 밀어 넣은 파일과 관련된 모든 것을 제거합니까?
bapors

1

제안 된 옵션을 많이 시도했지만 아무것도 작동하지 않는 것으로 보입니다 (다양한 문제는 나열하지 않음). 내가 일한 결과, 간단하고 직관적이었습니다 (나에게) :

  1. 다른 지역 리포지토리를 다른 곳으로 옮기다
  2. 마스터에서 로컬 드라이브로 repo를 다시 복제하십시오.
  3. # 1의 원본 복사본에서 파일 / 폴더를 # 2의 새 복제본으로 다시 복사
  4. 문제가 큰 파일이 없거나 .gitignore 파일에 제외되어 있는지 확인하십시오.
  5. 일반적인 git add / git commit / git push를 수행하십시오.

1

repo에서 파일을 제거한 후 BFG Repo-Cleanergit rm사용 하여 repo 기록에서 파일을 완전하고 쉽게 제거 할 수 있습니다.


0

실수로 내 '변경된 파일'목록을 오염시키고 싶지 않은 저장소에 obj 및 bin 파일이 있습니다.

그들이 리모콘에 갔다는 것을 알게 된 후에 이것을 추가하여 무시했습니다..gitignore

/*/obj
/*/bin

문제는 이미 원격에 있으며 변경되면 변경으로 팝업되어 변경된 파일 목록을 오염시킵니다.

표시를 중지하려면 원격 저장소에서 전체 폴더를 삭제해야합니다.

명령 프롬프트에서 :

  1. 되찾기 폴더로 CD (예 C:\repos\MyRepo)
  2. SSIS \ obj를 삭제하고 싶습니다. 그것은 당신이 지금 SSIS에 CD 필요하므로 만, 상위 수준에서 삭제할 수 있습니다 같다 : (예 C:\repos\MyRepo\SSIS)
  3. 이제 마법의 주문을 입력하십시오 git rm -r -f obj
    • rm = 제거
    • -r = 재귀 적으로 제거
    • -f = 힘을 의미합니다.
    • obj는 폴더입니다
  4. 이제 실행 git commit -m "remove obj folder"

13 개의 파일이 315222 삭제 되었다는 경고 메시지가 나타 납니다.

그런 다음 CMD 라인을 조회하고 싶지 않기 때문에 Visual Sstudio를 방문하여 리모컨에 적용하기 위해 동기화를 수행했습니다.


0

결정된 확장자 (예 : 컴파일 된 파일)에서 파일을 제거해야하는 경우 다음을 수행하여 한 번에 모두 제거 할 수 있습니다.

git remove -f *.pyc

0

설명서 에 따르면 .

git rm --cached giant_file

중요한 데이터와 관련하여 파일을 제거했다고 말하지 말고 마지막으로 알려진 커밋에 파일을 포함 시키십시오.

0. 마지막 커밋 수정

git commit --amend -CHEAD

모든 git history에서 파일을 삭제하려면 설명서 에 따라 다음을 수행해야합니다.

1. 지역 기록에서 삭제

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. 이 파일을 .gitignore에 포함시키는 것을 잊지 마십시오 (파일이 공유하고 싶지 않은 경우 (예 : 비밀번호 ...)).
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. 리모컨에서 제거해야하는 경우

git push origin --force --all

4. 태그 릴리스에서 제거해야하는 경우 :

git push origin --force --tags

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