받아 들여진 대답은 " 파일에 대해 Git을 "잊어 버린다 " ... (역사적으로) 아닙니다 . git 만 무시합니다.현재 / 미래의 파일을 하도록 .
이 방법은 git이 무시한 파일 ( 과거 / 현재 / 미래)을 완전히 잊게 하지만, 그렇지 않습니다 작업 디렉토리에서 아무것도 삭제 (원격에서 다시 당기더라도).
이 방법의 사용이 필요합니다 /.git/info/exclude
(선호) 또는 기존 .gitignore
의 모든 파일이 커밋 잊어 / 무시합니다. 1
git을 적용하는 모든 방법은 사후 행동을 무시하고 이력을 효과적으로 다시 작성 하므로이 프로세스 후에 가져올 수있는 공개 / 공유 / 공동 작업 저장소에 상당한 영향 을 미칩니다. 2
일반적인 조언 : 정리 된 저장소로 시작하십시오 – 커밋 된 모든 것, 작업중인 디렉토리 나 인덱스에 보류중인 것 없음, 백업을 만드십시오 !
또한, 코멘트 / 개정 역사 의 이 답변 ( 및 개정 역사 의 이 질문은 ) 계몽 / 유용 할 수 있습니다.
#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
#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch
git commit -m "ignored index"
#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits. If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command
git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all
#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch
git ls-files --other --ignored --exclude-standard
마지막으로 아래 명령에 대한 중요한 경고 / 정보가 포함 된 이 GitHub 안내서 (6 단계에서 시작) 의 나머지 부분을 따르십시오 .
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
현재 수정 된 원격 저장소에서 가져온 다른 개발자는 백업을 수행 한 후 다음을 수행해야합니다.
#fetch modified remote
git fetch --all
#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed
git reset FETCH_HEAD
각주
1/.git/info/exclude
위의 지침을 사용하여 모든 기록 커밋에 적용 할 수 있기 때문에 .gitignore
파일 이 필요한 기록 커밋에 파일 을 가져 오는 방법에 대한 자세한 내용 은이 답변의 범위를 벗어납니다. .gitignore
마치 내가 처음 한 것처럼 루트 커밋에 적절한 것을 원했습니다 . 커밋 히스토리 /.git/info/exclude
의 .gitignore
존재 위치에 관계없이 동일한 것을 달성 할 수 있기 때문에 다른 사람들은 신경 쓰지 않을 수 있으며, 파급 효과를 알고있을 때도 히스토리를 명확하게 다시 작성하는 것은 매우 감동적인 주제 입니다.
FWIW는 잠재적 인 방법이 포함될 수 있습니다 git rebase
또는 git filter-branch
사본 것을 외부 .gitignore
각으로가에 대한 답변처럼, 커밋 이 질문에
2 독립형 git rm --cached
명령 의 결과를 커밋하여 사실을 무시하고 git ignore 동작을 강제 실행하면 나중에 강제 푸시 된 원격 장치에서 끌어 올 때 새로 무시 된 파일이 삭제 될 수 있습니다 . --prune-empty
다음 git filter-branch
명령 의 플래그 는 이전의 "무시 된 파일 모두 삭제"인덱스 전용 커밋을 자동으로 제거하여이 문제를 방지합니다. 다시 쓰기도 자식 역사를 변경합니다 해시, 커밋 위력을 과시 공개 / 공유 / 협업의 repos에서 미래 당긴를. 이러한 리포지토리에이를 수행하기 전에 파급 효과를 완전히 이해하십시오 . 이 GitHub 안내서 는 다음을 지정합니다.
에 공동 작업자에게 REBASE , 하지 병합, 그들은 이전 (오염) 저장소 역사 오프 작성된 분기합니다. 한 번의 병합 커밋을 통해 방금 퍼지 문제를 겪은 오염 된 기록의 일부 또는 전부를 다시 소개 할 수 있습니다.
대체 솔루션을 하지 않는 원격 REPO에 영향을 미치지는 git update-index --assume-unchanged </path/file>
나 git update-index --skip-worktree <file>
의 예를 찾을 수 있습니다 여기에 .
git clean -X
비슷하게 들리지만이 상황에서는 적용되지 않습니다 (파일이 여전히 Git에 의해 추적되는 경우). 나는 잘못된 길을 따르지 않는 해결책을 찾는 사람을 위해 이것을 쓰고 있습니다.