2010-08-02 8 views
4

Peut-être qu'il me manque quelque chose sur l'utilisation de gi à travers svn, mais comment puis-je garder un ensemble de fichiers modifiés localement sans pousser ces changements à subversion.Git à travers svn - gestion des fichiers

Voici mon flux de travail cassé.

(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

Le problème réside dans le fait que svn rebasage, ou même commettre, je perds mon modifié localement, mais non t archivé dans les fichiers. Je ne veux pas commettre les fichiers, parce que je ne veux pas les tirer dans un commit svn.

Comment mon flux de travail est-il supposé fonctionner dans une situation comme celle-ci?

Répondre

2

Mon flux de travail git-svn ressemble à ceci:

(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 

La dernière étape rebase supprime tous les commits de la branche de travail qui ont déjà été commis en amont. Pour l'étape cherry-pick, j'utilise en fait un petit script shell qui obtient automatiquement tous les commits sauf ceux qui ont "NOCOMMIT" dans leur description. Vous pouvez utiliser un autre indicateur comme "LOCAL" ou "NOPUSH" ou ce que vous voulez. Ces commits sont ceux qui traînent sur la branche "travail" et ne sont pas poussés vers Subversion.

Voici mon scénario pull-work:

#!/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 

Notez l'utilisation des subtilités comme tac qui inverse l'ordre des énumérés engage donc ils s'appliquer à maîtriser dans le même ordre.

+0

Comment cela empêche-t-il que des fichiers modifiés, non validés, soient tirés dans le maître. Est-ce que cela fait partie de l'étape de la sélection des cerises? Comment cela fonctionne-t-il exactement? Pouvez-vous spécifier quelles versions de la branche à tirer en maître à partir d'une fusion? –

+0

Vous voulez poster votre script quelque part? –

+0

Je ne laisse pas de modifications modifiées et non validées. Si j'ai un changement dont j'ai besoin localement pour une raison quelconque, je fais le changement * et * le commet avec "NOCOMMIT" dans la description de la validation. Après tout, s'il y avait une raison au changement, je veux l'enregistrer. –

2

Il semble que ce qui se passe est que votre HEAD est en cours de réinitialisation. Pour éviter cela, utilisez svn dcommit --no-rebase.

Cependant, je pense que votre flux de travail est quelque peu cassé. Avoir des fichiers non validés ne fait pas l'affaire, n'est-ce pas?

Vous devriez probablement utiliser git stash. Cela rend votre nouveau flux de production:

(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 stash 
git svn rebase 
git svn dcommit 
git stash apply 

Le nom de votre stashes correctement, et vous devriez être en mesure de faire quoi que ce soit que vous essayez de le faire.

+0

Je préfère 'git stash save 'mumble quelque chose" 'et' git stash pop'. Le 'pop 'évite d'accumuler des cachettes. L'enregistrement marqué fait ce que vous suggérez et lui donne un nom utile. – bstpierre

0

S'il s'agit d'un fichier qui n'existe pas dans le référentiel, vous pouvez toujours l'ajouter (ou un modèle) à

.git/info/exclude
. Ensuite, il serait ignoré dans les commits git et ne finirait jamais par être poussé dans SVN.