etc./StackOverFlow

Git에서 파일에 대한 변경 사항을 추적하고 무시하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2021. 12. 21. 22:07
반응형

질문자 :Joshua Ball


.csproj 파일이 포함된 프로젝트를 복제했습니다. 내 로컬 csproj 파일이 Git에 의해 추적되는 것(또는 패치를 생성할 때 불러오는 것)이 필요하지는 않지만 분명히 프로젝트에 필요합니다.

내 LOCAL .gitignore*.csproj 를 추가했지만 파일은 이미 저장소에 있습니다.

git status를 입력하면 추적하거나 패치를 제출하는 데 관심이 없는 csproj

상태를 수행할 때(또는 패치를 생성할 때) 변경 사항을 볼 수 없도록 내 개인 저장소에서 이러한 파일의 "추적"을 어떻게 제거합니까(그러나 사용할 수 있도록 소스에 보관)?

이 상황을 처리하는 올바른/표준적인 방법이 있습니까?



개정 관리에서 제거하려는 각 파일에 대해 git rm --cached 를 호출하면 됩니다. 로컬 무시 패턴이 올바른 한 git status의 출력에 포함된 이러한 파일을 볼 수 없습니다.

이 솔루션은 저장소에서 파일을 제거하므로 모든 개발자는 파일의 자체 로컬(개정 제어되지 않음) 복사본을 유지 관리해야 합니다.

git이 이러한 파일의 변경 사항을 감지하지 못하도록 하려면 다음 명령도 사용해야 합니다.

 git update-index --assume-unchanged [path]

아마도 당신이하고 싶은 것 : ( @Ryan Taylor 답변 아래에서)

  1. 이것은 git에게 파일이나 폴더의 독립적인 버전을 원한다고 알려주기 위한 것입니다. 예를 들어 프로덕션/스테이징 구성 파일을 덮어쓰거나 삭제하고 싶지 않습니다.

git update-index --skip-worktree <path-name>

전체 답변은 다음 URL에 있습니다. http://source.kohlerville.com/2009/02/untrack-files-in-git/


anthony

세 가지 옵션이 있습니다. 아마도 #3을 원할 것입니다.

1. 이것은 당신을 위해 로컬 파일을 유지하지만 다른 사람이 가져올 때 삭제합니다.

git rm --cached <file-name> 또는 git rm -r --cached <folder-name>

2. 이것은 아마도 변경되지 않을 SDK와 같이 많은 수의 파일이 있는 폴더와 같은 최적화를 위한 것입니다. 큰 폴더에 변경 사항이 없을 때마다 로컬에서 확인하지 않도록 git에 지시합니다. assume-unchanged 인덱스는 재설정되고 파일/폴더에 대한 업스트림 변경 사항이 있는 경우 파일(들)을 덮어씁니다(끌어올 때).

 git update-index --assume-unchanged <path-name>

3. 이것은 git에게 파일이나 폴더의 독립적인 버전을 원한다고 알려주기 위한 것입니다. 예를 들어 프로덕션/스테이징 구성 파일을 덮어쓰거나 삭제하고 싶지 않습니다.

 git update-index --skip-worktree <path-name>

git update-index 는 git과 함께 전파되지 않으며 각 사용자는 이를 독립적으로 실행해야 한다는 것을 아는 것이 중요합니다.


Ryan Taylor

git update-index --assume-unchanged file.csproj 하면 git은 file.csproj에서 변경 사항을 자동으로 확인하지 않습니다. 그러면 변경할 때마다 변경 사항이 git 상태로 나타나지 않습니다. 따라서 모든 .csproj 파일을 이 방법으로 표시할 수 있습니다. 하지만 업스트림 리포지토리에서 보내는 새 파일을 수동으로 표시해야 합니다. ( .gitignore 또는 .git/info/exclude 에 있는 경우 생성한 항목은 무시됩니다.)

.csproj 파일이 무엇인지 완전히 확신할 수는 없습니다... IDE 구성(Eclipse의 .eclipse 및 .classpath 파일과 유사)을 따르는 것이라면 절대 소스 제어해서는 안 된다고 제안합니다. 모두. 반면에 Makefile과 같은 빌드 시스템의 일부인 경우 분명히 그래야 하며 선택적 로컬 변경 사항(예: local.csproj a la config.mk에서)을 선택하는 방법이 유용할 것입니다. : 빌드업을 글로벌 부분과 로컬 오버라이드로 나눕니다.


araqnid

다음은 2단계 프로세스입니다.

  1. 파일/폴더 추적 제거 - 디스크에 보관 - 사용

     git rm --cached

    이제 "변경됨"으로 표시되지 않지만 여전히 다음과 같이 표시됩니다.

     untracked files in git status -u
  2. .gitignore 추가


rjha94

수락 된 답변이 여전히 저에게 효과가 없었습니다.

나는 사용했다

자식 rm -r --캐시.

자식 추가 .

git commit -m ".gitignore 수정"

여기 에서 답을 찾았습니다


Buddhika Hasthanayake

.gitignore를 잊으셨습니까?

전체 프로젝트가 로컬에 있지만 git ignore를 추가하는 것을 잊었고 이제 일부 불필요한 파일을 추적하는 경우 이 명령을 사용하여 모든 것을 제거하십시오.

 git rm --cached -r .

프로젝트의 루트에 있는지 확인하십시오.

그럼 평소대로 하시면 됩니다

추가하다

 git add .

저 지르다

 git commit -m 'removed all and added with git ignore'

푸시

 git push origin master

결론

.gitignore 변경해야 하거나 함께 잊어버린 사람들에게 도움이 되기를 바랍니다.

  • 전체 캐시를 제거합니다.
  • .gitignore를 봅니다.
  • 추적하려는 파일을 추가합니다.
  • 저장소로 푸시

Joe Lloyd

다른 답변에서 지적했듯이 선택한 답변이 잘못되었습니다.

다른 질문에 대한 대답 은 그것이 필요할 수 있는 skip-worktree일 수 있음을 시사합니다.

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

해당 답변 은 기사( http://fallengamer.livejournal.com/93321.html )로 연결되며 다음과 같이 --assume-unchanged와 --skip-worktree의 차이점에 대한 요약이 포함된 기사를 인용합니다.

--assume-unchanged 는 개발자가 파일을 변경해서는 안 된다고 가정합니다. 이 플래그는 SDK와 같이 변경되지 않는 폴더의 성능을 개선하기 위한 것입니다.

--skip-worktree 는 개발자가 파일을 변경해야 하므로 git에게 특정 파일을 건드리지 않도록 지시할 때 유용합니다. 예를 들어, 메인 리포지토리 업스트림이 일부 프로덕션 준비 구성 파일을 호스팅하고 실수로 해당 파일에 변경 사항을 커밋하고 싶지 않은 경우 --skip-worktree가 정확히 원하는 것입니다.

그들의 연구와 답변에 대해 Boralid에게 모든 공을 돌립니다. 순전히 다른 사람들의 편의를 위해 이 정보를 포함합니다.


the_new_mr

git에 의한 파일 모니터링을 방지하려면

 git update-index --assume-unchanged [file-path]

그리고 그것을 다시 사용하려면

 git update-index --no-assume-unchanged [file-path]

유사한 사용 사례를 참조할 리포지토리 https://github.com/awslabs/git-secrets


shijin

시간을 절약하기 위해 .gitignore에 추가한 규칙을 사용하여 여러 파일/폴더를 제거할 수 있습니다.

git rm --cached app/**/*.xml

또는

git rm --cached -r app/widgets/yourfolder/


Peter

git update-index --assume-unchanged 를 사용하라고 조언합니다. 실제로 이것은 좋은 해결책이 될 수 있지만 단기적으로만 가능합니다.

아마도 하고 싶은 것은 git update-index --skip-worktree 입니다.

(아마 원하지 않는 세 번째 옵션은 git rm --cached 입니다. 로컬 파일은 유지되지만 원격 저장소에서 제거된 것으로 표시됩니다.)

처음 두 옵션의 차이점은 무엇입니까?

  • assume-unchanged 은 파일에서 수정 사항을 숨길 수 있도록 임시로 허용하는 것입니다. 파일에 대한 수정 사항을 숨기고 파일을 수정한 다음 다른 분기를 체크아웃하려면 no-assume-unchanged 를 사용하고 수정을 숨길 수 있습니다.
  • skip-worktree 는 체크아웃한 분기가 무엇이든 수정 사항과 함께 따라갑니다!

assume-unchanged 사용 사례

이 파일을 수정해서는 안 된다고 가정하고 git status 수행할 때 더 깔끔한 출력을 제공합니다. 그러나 다른 브랜치로 체크아웃할 때 플래그를 재설정하고 그 전에 변경 사항을 커밋하거나 숨길 필요가 있습니다. 이 옵션이 활성화된 상태에서 pull하면 충돌을 해결해야 하며 git은 자동 병합되지 않습니다. 실제로 수정 사항만 숨깁니다( git status 는 플래그가 지정된 파일을 표시하지 않음).

나는 잠시 동안만 변경 내용 추적을 중지 하고 동일한 수정과 관련된 git commit -a

skip-worktree 의 사용 사례

친구가 설정에 따라 변경해야 하는 매개변수(예: 비밀번호 포함)가 포함된 설정 클래스가 있습니다.

  • 1: 이 클래스의 첫 번째 버전을 만들고 채울 수 있는 필드를 채우고 다른 필드는 비어 있거나 null로 둡니다.
  • 2: 커밋하고 원격 서버에 푸시합니다.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: 고유한 매개변수로 구성 클래스를 업데이트하십시오.
  • 5: 다른 기능에 대한 작업으로 돌아가십시오.

당신이 하는 수정은 브랜치에 상관없이 당신을 따를 것입니다. 경고: 친구도 이 클래스를 수정하려면 설정이 동일해야 합니다. 그렇지 않으면 수정 내용이 원격 저장소로 푸시됩니다. 가져올 때 파일의 원격 버전이 사용자의 파일을 덮어써야 합니다.

추신: 둘 중 하나를 수행하지만 바람직하지 않은 부작용이 있으므로 둘 다 수행하지 마십시오. 다른 플래그를 시도하려면 먼저 후자를 비활성화해야 합니다.


belka

Git이 로컬 파일/폴더의 변경 사항을 추적하지 않도록 하려면(git status가 변경 사항을 감지하지 않음) 다음을 수행하십시오.

 git update-index --skip-worktree path/to/file

그리고 Git에게 로컬 버전의 변경 사항을 다시 한 번 추적하도록 지시하려면(변경 사항을 커밋할 수 있도록) 다음을 수행하십시오.

 git update-index --no-skip-worktree path/to/file

Kaka Ruto

한 줄 답변 git update-index --assume-unchanged [path]

중앙 저장소 및 로컬 저장소에 있는 파일이 있을 때마다 이것을 사용하십시오. 해당 파일을 변경해야 하지만 중앙 저장소에 준비/커밋해서는 안 됩니다. .gitignore 추가하면 안 됩니다. 시스템 관리자가 파일에 새로운 변경 사항을 도입하면 시니어 개발자를 모든 로컬 저장소에 배포해야 하기 때문입니다.

최상의 예: DB 연결을 위한 구성 파일 . 중앙 리포지토리에는 프로덕션 DB 서버 값이 포함된 모든 사용자 이름, 비밀번호, 호스트, 포트가 있습니다. 그러나 로컬 개발에서는 로컬 또는 다른 개발 DB 서버(팀에서 설정한)만 사용해야 합니다. 이 경우 구성 파일을 변경하고 싶지만 중앙 저장소에 커밋하면 안 됩니다.

최상의


Seeni

현재/미래에 .gitignore 적용

이 방법은 표준 .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

브랜치의 커밋 기록에서 새로 무시된 파일을 제거해야 하거나 향후 풀에서 새로 무시된 파일을 삭제하지 않으려는 경우 이 답변을 참조하십시오.


goofology

git rm --fileName

git ls-files 를 사용하여 파일이 제거되었거나 추적되지 않았는지 확인합니다.

git commit -m "UntrackChanges"

git push


Nisrine Bou Ghannam

각 파일을 개별적으로 선택하는 대신 특정 폴더 또는 bin 폴더의 모든 파일을 제거하는 방법을 묻는다고 가정합니다.

다음 명령을 사용할 수 있습니다.

git rm -r -f /<floder-name>\*

해당 디렉토리의 상위 디렉토리에 있는지 확인하십시오.
이 명령은 bin/ 또는 build/ 폴더에 있는 모든 파일을 재귀적으로 "삭제"합니다. 삭제라는 단어는 git이 해당 파일이 "삭제된" 것처럼 가장하고 해당 파일을 추적하지 않는다는 것을 의미합니다. git은 실제로 해당 파일을 삭제 모드로 표시합니다.

다가오는 커밋을 위해 .gitignore가 준비되어 있는지 확인하십시오.
문서 : git rm


Vraj Pandya

작업 순서에 따라 문제가 발생할 수 있습니다. .gitignore를 먼저 수정한 다음 git rm --cached xxx를 수정한 경우 이 문제가 계속 발생해야 할 수 있습니다.

올바른 솔루션:

  1. 자식 rm --캐시된 xxx
  2. .gitignore 수정

주문 불변!

수정 후 .gitignore 다시 로드!


thearyong

git 태킹에서 단일 파일을 제거하려고한다고 가정합니다. 이를 위해 아래 명령을 권장합니다.

git update-index --assume-unchanged

예 - git update-index --assume-unchanged .gitignore .idea/compiler.xml


Pankaj Sonani

디렉토리의 모든 파일(특정 유형)에 대한 변경 사항을 무시하려면 이러한 접근 방식 중 일부를 결합해야 했습니다. 그렇지 않으면 이전에 존재하지 않는 파일이 생성되었습니다.

아래에서 "excludedir"은 변경 사항을 관찰하지 않으려는 디렉토리의 이름입니다.

먼저 변경 추적 캐시에서 기존 새 파일을 제거합니다(파일 시스템에서 제거하지 않고).

 git status | grep "new file:" | cut --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache

modified: 것과 동일한 작업을 수행할 수 있습니다: . renamed: 는 새 파일 이름에 대해 -> 비트를 살펴보고 아래의 deleted: 대해 설명 ->

deleted: 파일은 로컬 시스템에 존재하지 않는 파일에 대해 업데이트 색인을 생성할 수 없는 것처럼 보이기 때문에 조금 더 복잡합니다.

 echo .deletedfiles >> .gitignore git status | grep "deleted:" | cut --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles cat .deletedfiles | xargs -d '\n' touch cat .deletedfiles | xargs -d '\n' git add -f cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged cat .deletedfiles | xargs -d '\n' rm

위 목록의 마지막 명령은 파일 시스템에서 파일을 다시 제거하므로 생략해도 됩니다.

그런 다음 해당 디렉터리에서 변경 내용 추적을 차단합니다.

 git ls-files excludedir/ | xargs git update-index --skip-worktree git update index --skip-worktree excludedir/

mpag

이 답변 에는 거의 git 명령이 필요 없는 접근 방식 이 제공되었습니다.

모든 로컬 저장소에 대한 특정 파일 을 무시하려면 다음을 수행하십시오.

  1. ~/.gitignore_global 파일을 만듭니다. 예를 들어 터미널에서 touch ~/.gitignore_global
  2. git config --global core.excludesfile ~/.gitignore_global 을 한 번 실행하십시오.
  3. 무시하려는 파일/디렉토리 경로를 ~/.gitignore_global 씁니다. 예를 들어 modules/*.H 는 작업 디렉토리에 있는 것으로 가정합니다(예: $WORK_DIR/modules/*.H .

단일 로컬 리포지토리에 대한 특정 파일 을 무시하려면 다음을 수행합니다.

  1. .git/info/exclude 대해 위의 세 번째 단계를 수행합니다. 즉, 무시하려는 파일/dir 경로를 .git/info/exclude 씁니다. 예를 들어 modules/*.C 는 작업 디렉토리에 있는 것으로 가정합니다(예: $WORK_DIR/modules/*.C .

Herpes Free Engineer

오랫동안 검색한 후 방법을 찾으십시오. .gitconfig .like에서 git 명령에 별칭을 지정하고 체크아웃하기 전에 분기 구성 파일을 되돌린 다음 건너뜁니다. 체크아웃 분기 후 sed 변경 구성 파일을 내 로컬 구성으로 변경합니다. checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :


chinaanihchen

출처 : http:www.stackoverflow.com/questions/936249/how-to-stop-tracking-and-ignore-changes-to-a-file-in-git

반응형