2009-03-11 5 views
7

git-svn dcommit을 실행할 때 중앙 svn 저장소에 체크 인되지 않는 로컬 git 저장소에서 추적하는 파일을 갖고 싶습니다. 필자는 종종 저장소에서 추적되는 파일에 대해 오래 지속 된 로컬 전용 변경 사항이 있습니다. 때로는 디버깅 코드 용입니다. 또한 프로젝트 IDE 파일을 추적하고 싶습니다. 일반 old svn을 사용하면 "XYZ : Do not Check In"이라는 레이블이 붙은 변경 목록에 파일을 저장 한 다음 커밋해야 할 변경 사항이 실제로있을 때 수동으로 처리합니다.git-svn을 사용하여 로컬 전용 변경/변경 세트를 어떻게 추적합니까?

이상적으로, 나는 마스터 브랜치에 내 변경 사항을 확인하고 싶지만 이러한 특정 변경 사항이 svn repo로 전달되지 못하도록하는 것을 설정하고 싶습니다. 나는 일반적인 방법으로 git와 git-svn을 사용할 것이지만, 어떤 커밋은 결코 푸시되지 않는다. 분명히, 내가 커밋을 할 때마다 수동으로이 작업을 수행 할 수 있지만 그게 고통이다.

저는 몇 가지 사항을 고려하여 버렸습니다. 때로는 커밋되지 않은 변경을해야하기 때문에 이러한 파일을 제외하고 싶지 않습니다. 또한 IDE 파일과 마찬가지로 내가 만든 모든 로컬 전용 분기에이 파일을 표시하고 싶습니다. 그러나 IDE 파일과 마찬가지로 모든 분기에서이 변경 사항을 원하기 때문에 이러한 변경 사항을 단일 분기로 분리 할 수는 없습니다. 그것은 죄책감이나 stgit 같은 것이 내가 원하는 것을 할 수도 있지만, 아직 배우지 않고있는 git 위에 자신 만의 복잡성 계층을 추가하기 때문에 분명하지 않습니다.

답변

0

stash를 사용하는 것이 좋습니다.

git-stash - Stash the changes in a dirty working directory away 

설명하는 내용이 부족할 수 있습니다.

+0

stash는 커밋되지 않은 변경 사항을 트리에 임시로 저장할 수 있습니다. 결국 OP는 파일의 변경 사항을 확인하려고하지만 SVN repo에 커밋되지 않도록합니다. – cmcginty

+0

사실, 나는 커밋하고 싶지 않을 수도있는 몇 가지 변화가 있습니다. 어쩌면 그건 나쁜 습관 일 수도 있지만, 편리합니다. – normal

2

나는 다소 새로운 git이지만 로컬 git repo에서 별도의 마스터 및 작업 분기를 사용하는 것이 좋습니다.

"비 SVN"파일을 작업 브랜치에만 추가하십시오. 일반적으로 작업 브랜치에서 모든 코드를 변경하십시오. "비 -VSN"파일이 변경되면 고유 한 커밋을 사용하여 파일을 추가하고 커밋 메시지 접두사 (예 : "local :"또는 "private :")를 설정합니다. 당신이 다음 SVN에 커밋 할 준비가되면 :

  1. 는 SVN에 추가 커밋의 로그를 표시 :

    git co working 
    git cherry master 
    
  2. 마스터 브랜치에 모든 업스트림 커밋을 추가, 무시 "개인"커밋합니다. 모든 업스트림 커밋이 마스터가 될 때까지이 단계를 반복하십시오.

    git co master 
    git cherry-pick <SHA1> 
    
  3. 밀어 SVN의의 repo에 커밋 :

    git svn rebase 
    git svn dcommit 
    
+0

제안 해 주셔서 감사합니다. 나는 그것으로 돌아 가야 할지도 모르지만, 단점은 매번 추가 작업을해야한다는 것입니다. – normal

0

내가 몇 가지 조사를했고, 그것을 할 수있는 가능성 내놓았다 : 2 명 자식 저장소를 같은 디렉토리 가리키는. 환경 변수 GIT_DIR은 로컬 저장소 디렉토리의 이름을 저장합니다. 설정하지 않으면 git의 기본값은 .git이지만 아무것도 될 수 없습니다.

내가 할 수있는 것은 내 Subversion 저장소에 매핑되는 .git 저장소가 하나있는 것입니다. 그게 일반적인 경우입니다. 그런 다음 .localgit에 다른 저장소를 가질 수 있습니다. 각 저장소는 다른 저장소가 관리하는 파일을 무시하도록 구성되어야합니다. 그건 쉽지! 패턴을 부정하기 위해.

로컬 전용 파일을 체크인 할 때 GIT_DIR 환경 변수를 변경하거나 --git-dir 명령 줄 인수를 사용합니다. 내 excludes/ignores가 제대로 설정된 경우 충돌에 대해 걱정할 필요가 없습니다. 분명히 최신 상태로 유지하는 데 약간의 오버 헤드가 있지만 파일을 다른 저장소에 추가 할 때 하나의 저장소에 제외 된 파일을 추가하는 래퍼 스크립트를 작성할 수 있습니다. 또한이 오버 헤드는 다중 분기 제안과 같이 모든 커밋보다 파일 당 한 번만 발생합니다.

간단하게 만들려면 이름 지정 규칙을 사용할 수 있지만 로컬 전용 파일의 수가 거의 확실하기 때문에 각 개별 파일에서 수행 할 수도 있습니다 (그렇지 않으면 ' 잘못하고있는 것).

이 접근법에서 볼 수있는 단점은 SVN 저장소의 파일과 같은 방식으로 로컬 전용 파일을 분기 및 숨김 및 재설정 할 수 없다는 것입니다. 하지만 내 수정 내용은 내 편집 내용과 비동기적일 수 있으므로 실제로는 중요한 문제는 아니라고 생각합니다. 다중 저장소를 인식하는 함수에 대한 래퍼를 작성할 수도 있습니다. 또한 로컬 전용 파일을 관리 할 때 좀 더 명확하게해야하지만 대부분의 상황에서는이를 처리해야합니다. 여러 리포지토리가 git 자체에 내장되어 있지 않을 수도 있습니다.

2

문제점에 대한 나의 현재 해결책은 스택 된 자식 (stg)을 사용하고 이러한 로컬 변경 사항을 별도의 패치로 유지하는 것입니다. 나는 서브 버전에 dcommit 할 필요가있을 때, 나는 별도의 패치 이러한 내가 쉽게 다른 데이터베이스 백엔드를 테스트하기 위해 내 단위 테스트를 수정 패치를 가질 수 있다는 것입니다 유지에 대해

stg pop # naming the patches that should not be commited 
stg commit # the rest of the patches to commit 
git svn dcommit 
stg push # naming the patches that are used locally 

좋은 일을한다. 그래서 일반적으로 나는 오라클에 대해 테스트,하지만 난 더비에 대해 확인하고 싶다면, 나는

stg push local-mods-derby 
ant tests 
stg pop 

을하거나 내가 PostgreSQL을에 대해 테스트하려는 경우, 나는 "여기에 로컬 mods-을

stg push local-mods-test-postgresql 
ant tests 
stg pop 

을 실행 derby "및"local-mods-test-postgresql "은 패치 이름입니다.

이렇게 별도의 패치를 유지하는 것은 stg에서 매우 쉽습니다.

1

마스터 브랜치에서 근무하지 않았습니까?

로컬 git 브랜치에서 변경 사항을 유지하면 주기적으로 원하는 변경 사항 만 svn 추적 브랜치에 병합하거나 체리 선택하십시오. 추적 분기로 전환하여 dcommit을 실행하십시오. 그런 다음 해당 지사로 돌아가서 리베이스하십시오.

여러 분기에서 변경 사항을 원하면 동일한 분기점을 기준으로 변경하십시오. 브랜치를 리스터 링을 통해 마스터 + 변경 사항으로 유지하십시오. 그런 다음 다른 모든 지점에 대해 기본 지점을 리베이스하십시오.

관련 문제