programing

추적되었지만 .gitignore에 있는 파일을 Git이 잊게 하려면 어떻게 해야 하나요?

fastcode 2023. 4. 15. 09:32
반응형

추적되었지만 .gitignore에 있는 파일을 Git이 잊게 하려면 어떻게 해야 하나요?

추적되고 있던 을 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★,.gitignore 그러나 list 、 、 、 、 、 、 일 list list list list list list list 。git status★★★★★★★ 에 파일을 완전히 잊게 할 수 Git에게 파일을 완전히 잊게 하려면 어떻게 해야 하나요?

.gitignore되지 않은 합니다(「추적되지 않은 파일」이 경우).add -fGit git git git git 、 Git git git git 、 Git git git 。그러나 Git은 이미 추적 중인 파일을 계속 추적합니다.

파일 추적을 중지하려면 인덱스에서 파일을 제거해야 합니다.

git rm --cached <file>

폴더와 폴더 내의 모든 파일을 반복적으로 제거하려면 다음 절차를 따릅니다.

git rm -r --cached <folder>

헤드 리비전에서의 파일 삭제는 다음 커밋에서 이루어집니다.

되지 않지만 됩니다.git pull.

아래 일련의 명령어는 (작업 디렉토리나 로컬 저장소가 아닌) Git 인덱스에서 모든 항목을 제거하고 Git 무시를 존중하면서 Git 인덱스를 업데이트합니다.PS. 인덱스 = 캐시

첫 번째:

git rm -r --cached .
git add .

그 후, 다음과 같이 입력합니다.

git commit -am "Remove ignored files"

또는 원라이너로서:

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

git update-index 다음 작업을 수행합니다.

git update-index --assume-unchanged <file>

주의: 이 솔루션은 실제로 다음과 같습니다..gitignore되지 않은파일에 할 수 .


업데이트, 더 나은 옵션

이 답변이 게시된 이후 새로운 옵션이 생성되었으며 이 옵션을 사용하는 것이 좋습니다. 하면 됩니다.--skip-worktree가 커밋하지 유지하기를 입니다.--assume-unchangedgit을 방지하고 빅 트래킹 파일의 상태를 확인하는 퍼포먼스를 제공합니다.자세한 것은, https://stackoverflow.com/a/13631525/717372 를 참조해 주세요.

git update-index --skip-worktree <file>

취소하다

git update-index --no-skip-worktree <file>
git ls-files -c --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

이렇게 하면 무시된 파일 목록이 나타나고 인덱스에서 해당 파일이 제거되고 변경 내용이 커밋됩니다.

이동시키고 커밋한 후 다시 이동합니다.

이것은 과거에 나에게 효과가 있었지만, 이것을 실현하기 위한 '기티한' 방법이 있을 것이다.

복사/붙여넣기(한 줄) 답변은 다음과 같습니다.

git rm --cached -r .; git add .; git status; git commit -m "Ignore unwanted files"

해도 내용은 ..gitignore에 이미 되지만, Git 저장소에했습니다. 하지만 이제 우리는 그것들을 Git 저장소에 추가했습니다..gitignore.

" " "git status;변경 내용을 확인하는 것으로, 폐기될 가능성이 있습니다.

최종적으로 "Ignore wanted files"라는 메시지와 함께 변경을 즉시 커밋합니다.

경우 부분( 「 」 )을 합니다.git commit -m "Ignore unwanted files")

추적되지 않은 파일을 제거하기 위해 항상 이 명령을 사용합니다.한 줄의 Unix 스타일의 클린 출력:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

이 있는 또, 모든 을 에 전달합니다.git rm -r --cached인덱스에서 경로/파일/디렉토리를 제거합니다.

다음 경우에 사용:

  1. 많은 파일을 추적 해제하거나
  2. .gitignore 파일을 업데이트했습니다.

출처: .gitignore기반으로 Git 저장소에 이미 추가된 파일을 추적 해제합니다.

Git 저장소에 일부 파일을 이미 추가/커밋한 후 .gitignore 파일에 추가했다고 가정해 보겠습니다.이 파일들은 여전히 저장소 인덱스에 존재합니다.이 기사에서는 그것들을 제거하는 방법에 대해 알아보겠습니다.

순서 1: 모든 변경 커밋

계속하기 전에 .gitignore 파일을 포함한 모든 변경사항이 커밋되었는지 확인하십시오.

순서 2: 저장소에서 모든 항목 삭제

저장소를 지우려면 다음을 사용합니다.

git rm -r --cached .
  • rm은 remove 명령어입니다.
  • -r은 재귀 제거를 허용합니다.
  • –filename을 지정하면 색인에서 파일만 삭제됩니다.파일은 그대로 남아 있습니다.

rm명령어는 용서할 수 없습니다.해 보고 는, 「이렇게 해 」를 추가해 주세요.-n ★★★★★★★★★★★★★★★★★」--dry-run이치노

순서 3: 모든 것을 읽다

git add .

순서 4: 커밋

git commit -m ".gitignore fix"

저장소가 깨끗합니다. : )

변경 사항을 리모컨에 푸시하면 변경 사항도 적용됩니다.

수 없는 git rm다른 사람이 필요로 할 가능성이 있기 때문에 추적된 파일(경고, 비록 당신이 그것을 사용하더라도) git rm --cached다른 사용자가 이 변경을 받으면 해당 파일은 파일 시스템에서 삭제됩니다).이것은, 설정 파일의 오버라이드나 인증 자격 정보등에 의해서 행해지는 경우가 많습니다.이 문제를 회피하는 방법에 대해서는, https://gist.github.com/1423106 를 참조해 주세요.

요약:

  • 응용 프로그램에서 무시된 파일 구성 오버를 찾습니다.ini 및 committed 파일 config.ini에서 사용합니다(또는 ~/.config/myapp.ini 또는 $MYCONFIGFILE을 찾습니다).
  • config-sample.ini 파일을 커밋하고 config.ini 파일을 무시한 후 필요에 따라 스크립트 또는 유사한 파일을 복사합니다.
  • gitattributes clean/smudge magic을 사용하여 변경을 적용 및 삭제합니다.예를 들어 대체 브랜치에서 체크 아웃으로 컨피규레이션파일을 스머지하고 HEAD에서 체크 아웃으로 컨피규레이션파일을 클리어합니다.이건 좀 까다롭네요. 초보 사용자에게는 추천하지 않습니다.
  • 컨피규레이션파일은 마스터에 Marge되지 않는 전용 전개 브랜치에 보관합니다.배포/컴파일/테스트를 수행할 때 해당 분기에 병합하여 해당 파일을 가져옵니다.이는 기본적으로 휴먼 머지정책과 추가 기트모듈을 사용하는 경우를 제외하고 번짐/깨끗한 접근법입니다.
  • 안티리컴포메이션:uspect-unchanged를 사용하지 마십시오.그것은 눈물만 남습니다(거짓말을 하는 것은 거스름돈이 영원히 없어지는 것과 같은 나쁜 일이 일어날 수 있기 때문입니다).

git filter-branch를 사용하여 이 작업을 수행하였습니다.제가 사용한 명령어는 man 페이지에서 가져온 것입니다.

경고: 전체 기록에서 파일이 삭제됩니다.

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

이력 여 " " 를 실행합니다.git rm각 커밋 전에 지정 파일을 삭제합니다.명령어를 실행하기 전에 백업하는 것을 잊지 마십시오.이 명령어는 손실됩니다.

무엇이 나에게 효과가 없었나요?

에서는) (Linux)를 제안하는 글을 .ls-files --ignored --exclude-standard | xargs git rm -r --cached하는 파일의 newline/LFda, newline/LF/da, newline/LF/da, newline/LF/da가 되어 있었습니다.\n그들의 이름으로.어느 솔루션도 없습니다.

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

이 상황에 대처합니다(파일을 찾을 수 없는 에러가 표시됩니다).

그래서 제안합니다.

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

은 「」를 합니다.-zls-files에 대한 인수 및-0xargs에 인수를 지정하여 파일 이름에 포함된 "예외" 문자를 안전하게/삭제합니다.

매뉴얼 페이지 git-ls-files(1)에는 다음과 같이 기술되어 있습니다.

-z 옵션을 사용하지 않을 경우 경로 이름의 TAB, LF 및 백슬래시 문자는 각각 \t, \n 및 \로 표시됩니다.

파일명에 이러한 문자가 포함되어 있는 경우는, 해결 방법이 필요하다고 생각합니다.

파일/폴더에 대해 다음 단계를 수행합니다.

파일 삭제:

  1. 이 파일을 .timeoutignore에 추가해야 합니다.
  2. 명령어(rm --rm 파일명)를 사용하여 해당 파일을 삭제해야 합니다.
  3. 를 실행해야 합니다(추가 필요).
  4. (commit -m) "파일 삭제"가 필요합니다.
  5. 그리고 마지막으로, (완전 푸시)

예를 들어 다음과 같습니다.

테스트를 삭제하고 싶습니다.txt 파일.실수로 GitHub에 푸시해서 삭제하고 싶습니다.명령어는 다음과 같습니다.

먼저 .gitignore 파일에 "test.txt"를 추가합니다.

git rm --cached test.txt
git add .
git commit -m "test.txt removed"
git push

폴더 삭제:

  1. 이 폴더를 .timeoutignore 파일에 추가해야 합니다.
  2. 명령어(rm -r --folder name)를 사용하여 해당 폴더를 삭제해야 합니다.
  3. 를 실행해야 합니다(추가 필요).
  4. (커밋 -m) "폴더를 삭제했습니다"가 필요합니다.
  5. 그리고 마지막으로, (완전 푸시)

예를 들어 다음과 같습니다.

.idea 폴더/디렉토리를 삭제하고 싶습니다.실수로 GitHub에 푸시해서 삭제하고 싶습니다.명령어는 다음과 같습니다.

먼저 .gitignore 파일에 .idea를 추가합니다.

git rm -r --cached .idea
git add .
git commit -m ".idea removed"
git push
  1. ★★★의 .gitignore– 를 파일에 합니다..gitignore.

  2. git rm -r --cached .– 추적된 모든 파일(원하는 파일과 원하지 않는 파일 포함)을 삭제합니다.이치노

  3. git add .– 의 파일이.gitignore.


올바른 방향을 가르쳐 주신 @AkiraYamamoto님에게 모자의 팁.

다음 단계를 순서대로 진행하면 괜찮을 거예요.

  1. 잘못 추가된 파일을 디렉토리/스토리지에서 제거합니다."rm -r"(리눅스용) 명령을 사용하거나 디렉터리를 참조하여 삭제할 수 있습니다.또는 PC의 다른 위치로 이동합니다(이동/제거를 위해 실행 중인 경우 IDE를 닫아야 할 수도 있습니다.

  2. 지금 .gitignore 파일에 파일/디렉토리를 추가하고 저장합니다.

  3. 명령어를 사용하여 Git 캐시에서 삭제합니다(디렉토리가 여러 개 있는 경우 이 명령어를 반복하여 하나씩 삭제).

     git rm -r --cached path-to-those-files
    
  4. 이제 다음 명령을 사용하여 커밋 및 푸시를 수행합니다.그러면 Git 리모트에서 해당 파일이 삭제되고 Git이 해당 파일의 추적을 중지합니다.

     git add .
     git commit -m "removed unnecessary files from Git"
     git push origin
    

아마도 Git의 컨셉('스냅샷, 차이점 없음' 섹션) 때문에 파일을 완전히 잊을 수 없을 것 같습니다.

이 문제는 예를 들어 CVS를 사용하는 경우 발생하지 않습니다.CVS는 정보를 파일 기반 변경 목록으로 저장합니다.CVS에 대한 정보는 일련의 파일과 시간 경과에 따른 각 파일의 변경입니다.

그러나 Git에서는 프로젝트 상태를 저장하거나 커밋할 때마다 기본적으로 그 순간 모든 파일이 어떻게 보이는지 사진을 찍어 해당 스냅샷에 대한 참조를 저장합니다.따라서 파일을 한 번 추가하면 해당 스냅샷에 파일이 항상 표시됩니다.

이 두 기사는 나에게 도움이 되었다.

git assempt-changed vs-skip-worktree 및 Git에서 추적된 파일의 변경을 무시하는 방법

파일이 이미 추적된 경우 이를 기반으로 다음을 수행합니다.

git update-index --skip-worktree <file>

이 시점부터 이 파일의 모든 로컬 변경은 무시되고 원격으로 이동하지 않습니다.리모트로합니다.이때, 리모트에서는 경합이 git pull.스태쉬가 작동하지 않아요.이 문제를 해결하려면 파일 내용을 안전한 장소에 복사하고 다음 단계를 수행하십시오.

git update-index --no-skip-worktree <file>
git stash
git pull

파일 내용이 원격 컨텐츠로 대체됩니다.변경 내용을 안전한 장소에서 파일에 붙여넣고 다시 수행합니다.

git update-index --skip-worktree <file>

사람이 을 한다면git update-index --skip-worktree <file>의, " " "pull없어져야 합니다.이 솔루션은 모든 개발자가 자체 프로젝트 구성을 가지고 있을 때 구성 파일에 적합합니다.

원격에서 파일을 변경한 경우 매번 이 작업을 수행하는 것이 편리하지는 않지만 원격 컨텐츠에 의한 덮어쓰기로부터 보호할 수 있습니다.

「 」의 git rm --cached명령어는 원래 질문에 응답하지 않습니다.

강제할 수 있을까요?git[어디서] [ [?

실제로 이 솔루션을 사용하면 파일을 저장소의 다른 모든 인스턴스에서 삭제할 수 있습니다.git pull!

Git이 파일을 잊도록 강요하는 올바른 방법은 여기 GitHub에 의해 문서화되어 있습니다.

매뉴얼을 읽을 것을 권장합니다만, 기본적으로는 다음과 같습니다.

git fetch --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch full/path/to/file' --prune-empty --tag-name-filter cat -- --all
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

교환만 하면 됩니다.full/path/to/file파일의 풀 패스를 지정합니다.꼭 해 주세요..gitignorefilename을 클릭합니다.

또한 Git 이력을 변경하기 때문에 저장소에 대한 비고속 포워드 푸시를 (일시적으로) 허용해야 합니다.

파일을 분실하지 않도록 파일을 안전한 곳으로 이동 또는 복사합니다.그런 다음 파일을 'git rm'하고 커밋합니다.

이전 커밋 또는 삭제되지 않은 다른 브랜치로 되돌아가도 파일은 계속 표시됩니다.단, 이후 모든 커밋에서는 파일이 다시 표시되지 않습니다.파일이 Git ignore에 있는 경우 다시 폴더로 이동할 수 있으며 Git은 파일을 볼 수 없습니다.

Matt Frear의 대답은 가장 효과적인 IMHO였습니다.다음은 제외 목록에 일치하는 파일을 Git 저장소에서만 제거하기 위한 Windows 사용자용 PowerShell 스크립트입니다.

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git
$ignoreFiles | % { git rm $_}

git add .

승인된 답변은 "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 the current index, not the 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, FWIW, FWIW가 포함될 수 .git rebase ★★★git filter-branch외부부품을 복사하는 .gitignore질문에 대한 답변처럼 각 약속에 대한 정보를 제공합니다.

2 스탠드아론의 결과를 커밋하여 사후 Git 무시 동작을 실행하다git rm --cached명령어를 실행하면 나중에 강제 삭제 리모트로부터의 풀로 새로 추가된 파일이 삭제될 수 있습니다.--prune-empty의 깃발git filter-branch명령어를 사용하면 이전 "무시된 모든 파일 삭제" 인덱스 전용 커밋을 자동으로 삭제하여 이 문제를 방지할 수 있습니다.Git 이력을 다시 쓰면 커밋 해시도 변경되어 향후 공개/공유/공동 저장소로부터의 유입에 큰 영향을 미칩니다.이러한 저장소에 대해 이 작업을 수행하기 전에 영향을 완전히 이해하십시오.이 GitHub 가이드에서는 다음을 지정합니다.

공동작업자에게 이전(오염된) 리포지토리 기록에서 만든 분기를 병합하지 말고 기본을 다시 지정하도록 지시하십시오.하나의 합병 커밋으로 당신이 방금 숙청했던 오염된 이력 중 일부 또는 전부를 다시 도입할 수 있습니다.

리모트 저장소에 영향을 주지 않는 대체 솔루션은 다음과 같습니다.git update-index --assume-unchanged </path/file> ★★★★★★★★★★★★★★★★★」git update-index --skip-worktree <file>예를 들어, 여기서 확인할 수 있습니다.

에는 '아, 아, 아, 아 아, 아, 아, 아, 아, 아, 아, 아, 아, 아....envrc.timeout ignore 파일에 있습니다.

그리고 나서 나는 사용했다:

git update-index --skip-worktree .envrc
git rm --cached .envrc

그리고 그 파일은 삭제되었다.

그리고 나서 나는 파일이 삭제되었다고 말하면서 다시 커밋했다.

했을 때git log -p파일 내용(Amazon S3의 비밀증명서)은 삭제된 내용을 보여주고 있으며 Git 저장소 이력에 이 내용을 표시하고 싶지 않습니다.

그 후 다음 명령을 사용했습니다.

git filter-branch --index-filter 'git rm --cached --ignore-unmatch .envrc' HEAD

그리고 나는 그 내용을 다시 볼 수 없다.

존브레이브의 답변은 좋았지만 내 작업 디렉토리가 엉망이어서commit -a한 . 이치노력하다

git config --global alias.exclude-ignored '!git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached &&  git ls-files -z --ignored --exclude-standard | xargs -0 git stage &&  git stage .gitignore && git commit -m "new gitignore and remove ignored files from index"'

분석:

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git ls-files -z --ignored --exclude-standard | xargs -0 git stage
git stage .gitignore
git commit -m "new gitignore and remove ignored files from index"
  • 색인에서 무시된 파일 제거
  • stage .disignore 및 방금 삭제한 파일
  • 저지르다

BFG는 빅 파일이나 패스워드 등의 불필요한 데이터를 Git 저장소에서 삭제하도록 특별히 설계되어 있기 때문에 큰 이력 파일(현재 커밋되지 않음)을 삭제하는 간단한 플래그가 있습니다: "--strip-blobs-bigger-than"

java -jar bfg.jar --strip-blobs-bigger-than 100M

이름으로 파일을 지정하려면 다음 작업도 수행할 수 있습니다.

java -jar bfg.jar --delete-files *.mp4

는 BFG 10~1000보다 10~.git filter-branch또한 일반적으로 훨씬 사용하기 쉽습니다. 자세한 내용은 사용 설명서를 참조하십시오.

출처: 저장소 크기 축소

CLI를 사용하지 않고 Windows에서 작업하는 경우 TortoiseGit을 사용하는 것이 매우 간단한 솔루션입니다.메뉴에 "삭제(로컬 유지)" 액션이 있어 정상적으로 작동합니다.

이것은, 최신의 Git(작성시의 v2.17.1)에서는 문제가 되지 않게 되었습니다.

마지막으로 .gitignore 파일은 추적되었지만 삭제된 파일을 무시합니다.다음 스크립트를 실행하여 직접 테스트할 수 있습니다.파이널git status아무 것도 할 수 없다

# Create an empty repository
mkdir gitignore-test
cd gitignore-test
git init

# Create a file and commit it
echo "hello" > file
git add file
git commit -m initial

# Add the file to gitignore and commit
echo "file" > .gitignore
git add .gitignore
git commit -m gitignore

# Remove the file and commit
git rm file
git commit -m "removed file"

# Reintroduce the file and check status.
# .gitignore is now respected - status reports "nothing to commit".
echo "hello" > file
git status

문제는 이렇게 해결했습니다.

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD
git push

여기에서는 기본적으로 이전 커밋에서 특정 파일의 이력을 다시 쓰려고 합니다.

상세한 것에 대하여는, 여기 filter-branch 의 man 페이지를 참조해 주세요.

출처: 저장소에서 중요한 데이터 삭제 - filter-branch 사용

출처 : Git : 잘못 커밋된 큰 파일을 삭제하는 방법

커밋되어 있는 DS_Store:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

다음 방법으로 무시:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

마지막으로, 약속하세요!

특히 IDE 기반 파일의 경우 다음을 사용합니다.

예를 들어 slnx.sqlite 파일의 경우 다음과 같이 완전히 삭제했습니다.

git rm {PATH_OF_THE_FILE}/slnx.sqlite -f
git commit -m "remove slnx.sqlite"

이러한 파일 중 일부는 프로젝트의 로컬 사용자 설정 및 기본 설정(열린 파일 등)을 저장합니다.따라서 IDE를 탐색하거나 변경할 때마다 해당 파일이 변경되므로 해당 파일이 체크 아웃되고 커밋되지 않은 변경으로 표시됩니다.

Windows에서 어려움을 겪고 있는 사용자가 전체 폴더를 무시하려면 파일 탐색기에서 원하는 '폴더'로 이동하여 마우스 오른쪽 단추를 누른 후 'Git Bash Here'를 수행하십시오(Windows용 Git가 설치되어 있어야 함).

다음 명령을 실행합니다.

git ls-files -z | xargs -0 git update-index --assume-unchanged

이 파일은 이력에서 아직 사용할 수 있으며 먼저 삭제된 파일을 추가한 커밋을 압축해야 했습니다.https://gist.github.com/patik/b8a9dc5cd356f9f6f980

  1. 커밋을 조합합니다.다음 예시는 마지막 3개의 커밋을 조합한 것입니다.
git reset --soft HEAD~3
git commit -m "New message for the combined commit"
  1. 뭉개진 커밋을 푸시합니다.커밋이 리모트로 푸시된 경우:
git push origin +name-of-branch

이 경우 삭제해야 할 여러 디렉토리에 여러 개의 .lock 파일이 있습니다.다음 작업을 수행했는데 각 디렉토리로 이동하여 삭제할 필요 없이 작동했습니다.

git rm -r --cached **/*.lock

이렇게 하면 내가 있는 'root' 아래의 각 폴더에 들어가 패턴과 일치하는 모든 파일이 제외됩니다.

언급URL : https://stackoverflow.com/questions/1274057/how-do-i-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore

반응형