2009-03-18 4 views
47

J'ai mes projets dans 2 dépôts. Un sous SVN et un sous Git. Chaque fois que je change quelque chose dans SVN, je veux faire la même chose dans le dépôt Git. Dire que je fais une modification au référentiel SVN, produisant la révision 125. Comment appliquer ces mêmes changements à mon dépôt Git (en supposant que mon dépôt Git est à jour avec la révision 124).Comment appliquer SVN diff à Git?

Merci.

Répondre

46

Ce que je fait did/recherche était:

cd /path/to/svn/repo 
svn diff -r 125 > /tmp/patch.diff 
cd /path/to/git/repo 
patch -p0 < /tmp/patch.diff 
+1

ça ne marchait pas très bien! –

+1

Désolé, c'était une situation vraiment spécifique. Je vous suggère de poster une question si vous rencontrez des problèmes :( – drozzy

+1

En général, git-svn est un meilleur moyen d'importer (et d'exporter) svn commits dans des dépôts git.Il gardera le message de commit et les informations d'auteur, et fera face à beaucoup cas de bord qui vont casser la réponse donnée ici (Bien sûr, ce script peut être plus approprié pour votre situation s'il y a des contraintes externes dont vous n'avez pas discuté ici) – Rich

18

Essayez:

svn diff | patch -d /path/to/git/repo -p0 

Voir svn help diff si vous souhaitez exporter diff d'une révision spécifique.

+1

Pourquoi pas ce travail avec le -p0 est laissé? –

+0

Voir -pnum dans http://linux.die.net/man/1/patch En particulier, recherchez dans la page les mots "ne spécifiant pas -p". Je pense que si vous ne le spécifiez pas, patch ignorera le chemin du fichier et utilisera simplement le nom du fichier. – drozzy

2

Outre l'utilisation du patch comme mentionné ci-dessus, vous pouvez aussi envisager la création d'un post-commit hook si vous n'avez pas le faire à chaque fois que vous vous engagez quelque chose de nouveau.

5

Pourquoi personne n'aime git-svn? Je ne peux pas supposer que personne ne le sait.

Il y a git-svn (et git-hg et git-cvs et git-bzr afaict). Au moins avec vous pouvez simplement faire git-svn

git svn clone --stdlayout http://myrepo/root here 

utilisant -s (--stdlayout) prend le tronc standard/branches/tags/mise en page, mais vous pouvez l'avoir tout de quelle manière (man git-svn).

Le mappage est bidirectionnel, vous pouvez donc pousser et tirer comme avec une télécommande native (git). Pas de questions posées.

+0

N'hésitez pas à ajouter un crochet post-commit pour faire un push automatique après la validation :) – sehe

+0

This doesn Ne fonctionne pas pour moi avec svn-git sous Windows car 'git apply' échoue car il ne peut pas analyser correctement les chemins relatifs des diffs svn-style. –

+1

@the_mandrill erm ... utilise 'patch -p1' (ou -p0, ou quoi que ce soit que vous ayez besoin de déshabiller). Oh, attendez. Oooold question. Le fait est que vous n'avez pas besoin de diffs de style svn. 'git cherry-pick' – sehe

0

Le ci-dessous a fonctionné pour moi.

Source: How to create and apply a patch with Git

Tout d'abord, jetez un oeil à ce que les changements sont dans le patch. Vous pouvez le faire facilement avec git appliquer

git apply --stat fix_empty_poster.patch 

Notez que cette commande NE appliquer le patch, mais seulement vous montre les statistiques sur ce qu'il va faire. Après avoir jeté un coup d'œil dans le fichier patch avec votre éditeur favori, vous pouvez voir les changements réels.

Ensuite, vous vous intéresserez à la difficulté du patch. Git vous permet de tester le correctif avant de l'appliquer.

git apply --check fix_empty_poster.patch 

Si vous ne recevez pas d'erreurs, le patch peut être appliqué proprement. Sinon, vous pourriez voir quels problèmes vous rencontrerez. Pour appliquer le patch, je vais utiliser git am au lieu de git apply. La raison en est que git am vous permet de signer un patch appliqué. Cela peut être utile pour référence ultérieure.

git am --signoff < fix_empty_poster.patch 

Applying: Added specs to test empty poster URL behaviour 
Applying: Added poster URL as part of cli output 

Ok, les correctifs ont été appliqués proprement et votre branche principale a été mise à jour. Bien sûr, réexécutez vos tests pour vous assurer que rien ne s'est cassé.

Dans votre journal git, vous trouverez que les messages de validation contiennent une balise "Sign-off-by". Cette balise sera lue par Github et d'autres pour fournir des informations utiles sur la façon dont le commit s'est retrouvé dans le code.

4

Si vous allez générer un patch dans SVN et l'appliquer avec Git plus tard, ne pas oublier d'utiliser --git command-line option:

--git

Active un mode de sortie spécial pour svn diff conçu pour une compatibilité croisée avec le populaire système de contrôle de version distribuée Git .

Par exemple, exécutez

svn diff --git -r 125 > /tmp/patch.diff

+0

svn: option invalide: --git – sloven

+0

@Nik Je suppose que votre client svn est trop vieux. Quel est le résultat de svn --version? – bahrep

+0

svn version 1.6.13 – sloven

Questions connexes