.gitignore에 추가 한 후 원격 저장소에서 디렉토리를 제거하십시오.


597

나는 디렉토리를 커밋하고 github에 푸시했다. 그 후 .gitignore무시해야 할 디렉토리를 추가 하여 파일을 변경했습니다 . 모든 것이 잘 작동하지만 (현재 무시 된) 디렉토리는 github에 있습니다.

github 및 저장소 기록에서 해당 디렉토리를 어떻게 삭제합니까?


답변:


1065

.gitignore파일 의 규칙은 추적되지 않은 파일에만 적용됩니다. 해당 디렉토리 아래의 파일은 이미 저장소에서 커밋되었으므로 파일을 스테이지 해제하고 커밋을 생성 한 다음 GitHub에 푸시해야합니다.

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

리포지토리의 기록을 다시 쓰지 않고 기록에서 파일을 삭제할 수 없습니다. 다른 사람이 리포지토리를 사용하거나 여러 컴퓨터에서 파일을 사용하는 경우이 작업을 수행해서는 안됩니다. 그래도이 작업을 수행 git filter-branch하려면 기록을 다시 작성하는 데 사용할 수 있습니다 . 여기에 유용한 안내서가 있습니다 .

또한 출력은 git rm -r --cached some-directory다음과 같습니다.

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rm저장소에 대한 자식 피드백이고; 파일은 여전히 ​​작업 디렉토리에 있습니다.


3
다른 사람이 가져 오면 이제 무시 된 파일이 삭제되거나 그대로 유지됩니까?
Martin Konicek

3
@Martin Konicek : 변경 사항을 가져 오는 사용자가 해당 파일을 수정하지 않으면 해당 파일이 제거됩니다.
Mark Longair

@MarkLongair 무엇을 -r하고 --cached. 감사.
Labanino

12
@Labanino : -r전체 디렉토리를 수행하는 경우 재귀 적임을 의미합니다. --cached우선 자식의 정상적인 작업 디렉토리에서 삭제의 행동 커밋에 대한 삭제를 준비하고, 차종은 투입에 대한 준비가 준비 영역에서 작동에만 이눔 아. git에게 파일의 로컬 사본을 보관하고 싶다고 말하는 방법입니다.
entheh

2
이것은 잘 작동하지만, 먼저해야했습니다. git reset name_of_file위에 설명 된 내용이 작동하려면
Edvard Haugland

248

나는 이것을한다:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

git에있는 모든 파일 / 폴더를 무시하고 무시하고 수동으로 하나씩 선택해야합니다.


이것은 나를 위해 일을 중단 한 것으로 보입니다.

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

4
고마워, 이것은 나에게 많은 도움이되었습니다! Windows Powershell을 사용하는 경우 다음을 수행 할 수 있습니다.foreach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Matthew

10
두 번째 접근 방식을 시도했지만 로컬 git에서 모든 파일이 제거되었습니다!
artnikpro

2
하위 디렉토리로 이동하여 수행해야한다고 생각합니다. 틀 렸으면 말해줘.

오늘 우리는 무엇을 배웠습니까? "스택 오버플로에서 찾은 임의 코드를 실행하지 마십시오!"
Jonathan Landrum

49

내 대답에 따라 여기 : git 저장소에서 디렉토리를 제거하는 방법은 무엇입니까?

로컬에서가 아닌 git 저장소에서만 폴더 / 디렉토리를 제거하려면 간단한 3 단계를 시도하십시오.


디렉토리를 제거하는 단계

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

다음 커밋에서 해당 폴더를 무시하는 단계

다음 커밋에서 해당 폴더를 무시하려면 .gitignore 라는 루트에 하나의 파일을 만들고 해당 폴더 이름을 폴더에 넣으십시오. 원하는만큼 넣을 수 있습니다

.gitignore 파일은 다음과 같습니다

/FolderName

디렉토리를 제거


1
이것이 바로 내가 찾던 것입니다. 감사합니다 :)
Rohit Singh

나는 @Rohit 싱 도움이 기뻐요
eirenaios을

9

Blundell의 첫 번째 대답은 저에게 효과적이지 않았습니다. 그러나 그것은 올바른 길을 보여주었습니다. 나는 이와 같은 일을했다 :

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

아래 명령문을 실행하여 먼저 삭제할 파일을 확인하는 것이 좋습니다.

git ls-files -i --exclude-from=.gitignore

Visual Studio에 기본 .gitignore 파일을 사용하고 있었고 프로젝트에서 의도 한 작업이 아닌 모든 로그 및 bin 폴더를 제거하고 있음을 알았습니다.


5

참고 :이 솔루션은 Github Desktop GUI 에서만 작동합니다 .

Github Desktop GUI 를 사용 하면 매우 간단합니다.

  1. 폴더를 다른 위치 (프로젝트 폴더 외부)로 임시로 이동하십시오.

  2. .gitignore파일을 편집 하고 github 페이지에서 마스터 저장소를 제거 할 폴더 항목을 제거하십시오.

  3. 프로젝트 폴더를 커밋하고 동기화하십시오.

  4. 폴더를 프로젝트 폴더로 이동하십시오.

  5. .gitignore파일을 다시 편집 하십시오.

그게 다야.


5

Blundell의 답변은 효과가 있지만 기괴한 이유로 나와 관련이 없습니다. 첫 번째 명령으로 출력 된 파일 이름을 파일로 먼저 파이프 한 다음 해당 파일을 반복하고 해당 파일을 하나씩 삭제해야했습니다.

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

4

이 방법은 표준 .gitignore 동작을 적용 하며 무시해야 할 파일을 수동으로 지정할 필요가 없습니다 .

--exclude-from=.gitignore더 이상 사용할 수 없습니다 : /-업데이트 된 방법은 다음과 같습니다.

일반적인 조언 : 깨끗한 리포지토리로 시작하십시오 – 커밋 된 모든 것, 작업중인 디렉토리 나 인덱스에 보류중인 것이 없으며 백업을 만드십시오 !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

브랜치의 커밋 히스토리에서 새로 무시 된 파일을 제거해야 하거나 새로 무시한 파일을 향후 풀에서 삭제하지 않으려면 이 대답을 참조하십시오 .


0

PowerShell에서 작업하는 경우 단일 명령으로 다음을 시도하십시오.

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

그런 다음, git push --force --all.

설명서 : https://git-scm.com/docs/git-filter-branch


사용 git filter-branch과 다른 점은 git rm무엇입니까? 나는 원래 버전을 사용해야한다고 생각 git filter-branch했지만 대부분의 의견 은을 사용하는 것이 좋습니다 git rm. 내가 이해 git rm하는 것에서 현재 작업 디렉토리와 색인에서만 제거합니다. 그러나 이전에 여러 커밋을 추가 한 경우에도 여전히 저장소에 있습니다.
alpha_989

권리. git rm최신 커밋에서 미래에 파일을 제거합니다. git filter-branch전체 기록에서 삭제하겠습니다. 참조 : help.github.com/articles/...를
숀 Luttin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.