2012-05-18 2 views
16

를 삭제하지 않고 추적되는 :/힘내 파일을 무시는 내가 기본 자식의 개념을 이해하는 몇 가지 문제가 있어요 그들에게

내가 내 자식 제어 사이트에 몇 가지를 시도하기 전에 내 로컬 Windows 시스템에서 테스트를하고있다.

gittesting/repo1: 
    file.txt 
    ignoreme: 
     ignore.txt 

gittesting/repo2 
    file.txt 
    ignoreme: 
     ignore.txt 

Repo2이 repo1의 사본이며, ignoreme 이미 추적되고 :

나는 있습니다. ignore.txt 파일은 repo2에서 변경되지만 추적을 중지하고 git이 완전히 무시하도록하려고합니다. 문제는 내가 .gitignore 파일을 만들고 ignoreme을 추가하면 이미 추적 중이므로 너무 늦기 때문에 git rm --cached ignore를 수행해야하지만 삭제 된 것으로 표시되고 커밋을 가져온 경우 문제가 발생한다는 것입니다. repo1, 디렉토리는

그것을 요약하면 .. 대신 혼자 존재의 삭제 될 것입니다 :

  1. ignore.txt 두의 repos 사이의 서로 다른 내용을 가지고있다.
  2. 나는 그들이 완전히 내가, 온라인 보았다 IRC에 요청하고, 매우 관련 질문을 검토 한

자식 무시로 ignore.txt의 내용을 유지하기를 원하지만 할 수 없습니다 이것을하는 방법을 찾으십시오. 예제가 사소한 것처럼 보입니다.하지만 정확하게 사이트가 포럼/캐시 인 내 사이트에서해야 할 일입니다.


편집 :

이 해킹의 비트와 나는 더 나은 대답을 선호하는 것,하지만 난 일을 결국 :

cd repo2 
echo "ignoreme" > .gitignore 
echo "ignoreme/*" > .gitignore 
git rm --cache -r ignoreme 
git commit -m "Should ignore now" 
cd ../repo1 
mv ignoreme ignoreme2 
git pull ../repo2 
mv ignoreme2 ignoreme 

답변

7

질문을 올바르게 이해했다면 repo2ignoreme/ 디렉토리에 대해 알리 길 원하지만 Git에서 디렉토리 수정에 신경 쓰고 싶지는 않습니다. 그리고 git rm --cached은 Git에게 에게 지금부터이 콘텐츠 추적을 중지하기 때문에 도움이되지 않습니다.

콘텐츠를 추적하기위한 힘의 해결책이지만 특정 지점에서 고정되는 것은 하위 모듈을 통한 것입니다. rack 비록

이 작업 디렉토리에서 하위 디렉토리, 힘내 해당 디렉토리에 없을 때 그 내용을 추적하지 않는 서브 모듈로보고 경우 : Git Book에서 제외이 (추가 강조)를 설명합니다. 대신 Git이 해당 저장소의 특정 커밋으로 기록합니다.

다음과 같은 시도 할 수 :

  1. 복사 새 위치에 ignoreme/ 디렉토리 및

  2. repo2에 서브 모듈로 다시 추가 그것을 자식 저장소를 만들 :

    git submodule add file:///path/to/ignoreme ignoreme 
    git commit -m"Add ignoreme/ as a submodule" 
    

하위 모듈 ignoreme이 이제 특정 커밋에 고정됩니다. repo2은 하위 모듈에있는 콘텐츠를 계속 추적하지만 하위 모듈에서 파일을 커밋하지 않는 한 ignoreme/의 파일 변경 사항은 repo2에서 추적되지 않습니다. 이제 ignoreme/ignore.txt을 가정 해 봅시다 어떻게 든 수정 :

$ git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# (commit or discard the untracked or modified content in submodules) 
# 
#  modified: ignoreme (modified content) 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

그들과 같이 서브 모듈에 최선을 다하고 있습니다하지 않는 한 당신은 git add .ignoreme/ignore.txt의 변화가 인덱스에 추가되지 않습니다 실행하더라도 :

$ cd ignoreme 
$ git commit -am"Time to change ignore.txt" 
$ cd .. 
$ git add . 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: ignoreme 
# 

을하지만 경우 하위 모듈의 로컬 수정을 잊어 버리고 싶습니다.

$ cd ignoreme 
$ git reset --hard 
$ cd .. 
1

힘내 디렉토리를 저장하지 않습니다. Git에 빈 디렉토리를 저장하고 싶다면, 빈 파일 인 .keepme을 넣고 커밋해야한다.

질문에 대해서는 업스트림 브랜치의 파일을 복제본에서 내 지식에 숨길 수 없습니다. 이것은 힘내라 할 수있는 것이 아닙니다. 두 개의 리포지토리로 분할하는 것과 같은 다른 옵션을 고려하십시오 (하위 트리 또는 하위 모듈 사용). 또는 업스트림에있는 별도의 브랜치를 다운 스트림에 의해 추적되도록 유지하고 수신 후크로 해당 브랜치에서 ignore.txt을 필터링하십시오.

더 많은 정보를 원하신다면 어쩌면 더 좋은 방법이 있을지도 모릅니다.

어쨌든, 난 당신이 "보안"이유로이 파일을 숨기려고하지 않는 희망 - 그렇지 않으면 문제가 훨씬 더 복잡한 것 (예를 들어, 당신이 전체 역사 등에서 선택을 취소해야) 체크 아웃

+2

나는 항상 "빈"디렉토리를 위해 디렉토리 안에'.gitignore'를 두는 것을 선호한다. – meagar

+0

맞춤식 접근법은 빈'.gitkeep' 파일을 커밋하는 것입니다. 그 이유는 간결하고 모호하지 않은 접두사입니다.'. * # ignore dotfiles'!! .git * # 저장소를 구성하는 접두사가 아닙니다. 즉, .gitignore, .gitkeep' –

+0

.keepme은 널리 사용되는 관용구입니다. 관용어가 늘 그렇듯이 곡식에 어긋나고 자신의 위험을 무릅 쓰고 할 수 있습니다. –

0

을 그 파일을 가지고있는 커밋은 그것을 대체 할 것이고 커밋에서 그것으로 커밋으로 옮겨 가면서 그것을 제거 할 것이다. 힘내는 다른 것을 할 수 없었다. .gitignore는 repo를 덮어 쓰지 않으므로 상태 보고서를 잘 보지 않아도됩니다.

파일을 git의 영역 밖에있는 심볼 링크로 만들면 나쁜 기록을 쉽게 체크 아웃하여 피해를 복구 할 수 있습니다. 그 옵션이 없다면 filter-branch가 있습니다.

18

git update-index --assume-unchanged ignoreme/ignore.txt 

힘내 저장소를 변경하지 않고이 파일에 대한 미래의 변화를 무시하십시오. 다시 변경 추적을 시작하려면이는 현재 작업 복사본에 대한 효과를 소요

git update-index --no-assume-unchanged ignoreme/ignore.txt 

주를 사용, 그래서 당신은 당신이 저장소를 복제이마다 할 필요가있다.

+1

그것은 여전히 ​​파일을 변경했습니다 : ( – mowwwalker

+1

이것은 파일이 변경되는 것을 멈추지 않습니다. 단지 자식이 변경된 것으로 파일을 표시하는 것을 멈추게 할 것입니다. 파일에 대한 변경을 완전히 막으려면 읽기 전용으로 설정할 수 있습니다. –

+2

실제로'--assume-unchanged'를 사용하는 것은 실제로 파일을 변경하지 않는다면 합법적입니다. 당신이 그것을 바꾼다면, 거짓말을하고 잘 끝내지 못할 것입니다. –

0

힘내 추적되지 않은 파일에만 무시 패턴이 적용됩니다. 무시 패턴을 사용하여 이미 git에서 추적 한 파일의 변경 사항을 무시할 수 없습니다. 그래도 사람들이 문제를 해결하는 방법에 대해서는 https://gist.github.com/1423106을 참조하십시오.

참고 .gitignore 자체가 걱정된다면 .git/info/excludes를 로컬 repo 전용 .gitignore 파일로 사용해보십시오.이것은 이 아니고은 추적 된 파일을 변경하는 문제를 해결할 수 있으며 추적 할 수없는 추가 .gitignores 만 제공합니다.

관련 문제