2010-08-02 9 views
4

아마도 svn을 통해 gi를 사용하는 것에 대해 빠진 것이지만, 변경 사항을 전복하지 않고 로컬로 수정 된 파일 세트를 유지하려면 어떻게해야합니까?Git through svn - 파일 관리

내 워크 플로가 고장났습니다.

(on master) git svn rebase
git checkout -b issue
*apply changes I need on all my branches*
*changes*
git commit *changes*
git checkout master
git merge issue
git svn dcommit

문제는 사실에있다 svn의 REBASE, 또는 저지르고, 나는 잃을 것이 내 로컬 수정되었지만 아니 파일을 체크 인하 지 않았습니다. 파일을 커밋하고 싶지는 않습니다. 왜냐하면 그 파일을 svn 커밋에 넣고 싶지 않기 때문입니다.

내 워크 플로가 이와 같은 상황에서 어떻게 작동해야합니까?

(on master) git svn rebase 
git checkout work 
... make commits for all changes, including local-only and those I intend to push up 
git checkout master 
... cherry-pick changes from work branch 
git svn dcommit 
git checkout work 
git rebase master 

마지막 rebase 단계는 이미 상류 커밋 된 작업 지점에서 모든 커밋을 제거합니다

답변

2

내 자식 - svn을 워크 플로우는 다음과 같이 보인다.

cherry-pick 단계의 경우 실제로 설명에 "NOCOMMIT"이있는 문자는 이 아닌을 제외한 모든 커밋을 자동으로 가져 오는 작은 셸 스크립트를 사용합니다. "LOCAL"또는 "NOPUSH"와 같은 다른 표시기를 사용하거나 원하는 것을 사용할 수 있습니다. 이러한 커밋은 "작업"분기에 매달려 있으며 Subversion으로 푸시되지 않습니다. 나열된 순서를 반대로 tac 같은 미묘한의 사용은 그들이 동일한 순서로 마스터에 적용받을 그래서 커밋

#!/bin/sh 

BRANCH=`git branch | grep ^\\* | cut -d' ' -f2` 
if [ $BRANCH != "master" ]; then 
    echo "$0: Current branch is not master" 
    exit 1 
fi 

git log --pretty=oneline work...master | grep -v -E '(NOCOMMIT|DEBUG):' | cut -d' ' -f1 | tac | xargs -l git cherry-pick 

참고 :

여기 내 pull-work 스크립트입니다.

+0

수정 된 커밋되지 않은 파일이 마스터로 가져 오지 않게하는 방법은 무엇입니까? 그 체리 선택 단계의 일부입니까? 정확히 어떻게 작동합니까? 병합에서 마스터로 가져올 분기의 버전을 지정할 수 있습니까? –

+0

어딘가에 스크립트를 게시 하시겠습니까? –

+0

수정 된 커밋되지 않은 변경 사항을 전혀 사용하지 않습니다. 어떤 이유로 로컬로 변경해야하는 경우 커밋 설명에 "NOCOMMIT"을 사용하여 변경하고 * 커밋합니다. 결국, 변경 이유가 있다면 기록하고 싶습니다. –

2

HEAD가 다시 설정되는 것입니다. 이를 방지하려면 svn dcommit --no-rebase을 사용하십시오.

그러나 워크 플로가 다소 문제가 있다고 생각합니다. 커밋되지 않은 파일을 사용하면 그 목적을 상실 할 수 있습니까? 아닙니다.

아마도 git stash을 사용해야합니다. 이렇게하면 새 워크 플로가 만들어집니다.

확장명을 적절하게 지정하면 수행하려는 작업을 모두 수행 할 수 있어야합니다.

+0

나는'git stash save "와'git stash pop'을 선호합니다. 'pop'은 은닉을 방지합니다. 레이블이 지정된 저장은 사용자가 제안한대로 유용하며 유용한 이름을 제공합니다. – bstpierre

0

레포에없는 파일 인 경우 언제든지

.git/info/exclude
에 파일 (또는 패턴)을 추가 할 수 있습니다. 그렇다면 git 커밋에서 무시되고 결국 SVN에 푸시됩니다.