2017-07-10 1 views
0

j'ai un certain nombre de dépôts git que je voudrais:synchronisent deux dépôts Git ancestraly liés ignorant certains commits

  1. Port vers un nouveau serveur git.
  2. Ajoutez-y des sous-modules.

Ceci en soi serait simple, le fait est que je voudrais le faire progressivement. C'est-à-dire que je veux que les utilisateurs continuent à cloner/tirer/pousser sur les anciens repos et en même temps, transfèrent ces validations aux nouveaux repos. Finalement, ce "vieux" serveur serait supprimé et les utilisateurs commenceraient à utiliser le nouveau avec les sous-modules. J'ai un serveur jenkins qui serait chargé de porter tous ces repos de l'ancien serveur vers le nouveau everynight. Encore une fois, ce serait assez simple, sauf du fait que je veux que les nouveaux repos aient des sous-modules que les anciens repos n'ont pas. Donc, la situation serait comme:

Old Repo  New Repo 
    |    | 
CommitA-------->CommitA 
    |    | 
    |   CommitB (Add submodules) 
    |    | 
CommitC-------->CommitC 
    |    | 
CommitD-------->CommitD 
    |    | 
    .    . 
    .    . 
    .    . 

Comme vous pouvez le voir, je veux au port tous les commits de l'Ancien Repo au nouveau whitout rien perdre de leur information (je ne veux pas de copier uniquement les sources de l'Ancien et les écraser dans le Nouveau dépôt, car cela perdrait les commentaires et les commits intermédiaires, puisque cette opération de portage serait effectuée une fois par jour). Quelqu'un peut-il me donner quelques conseils sur la façon d'y parvenir et comment puis-je l'exécuter dans un mode «automatisé» (non seulement en sélectionnant un à un les commits).

Merci!

EDIT

donc j'ai essayé et maintenant j'ai:

#Clone "New Repo" 
git clone ssh://<NewRepoServer>/bitbucket_tests bitbucket_tests 
cd bitbucket_tests 
#Add "Old Repo" remote 
git remote add old_repo <OldRepoServer/bitbucket_tests>; 
#update New Repo remote 
git remote update origin; 
#update Old Repo remote 
git remote update old_repo; 
#Loop through all branches, and try to merge them 
for remote_branch in `git branch -r | grep old_repo | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do 
    git branch -f --track $remote_branch 
    git checkout $remote_branch 
    git pull -s recursive -X patience -X theirs old_repo $remote_branch 
    git pull 
done 
git checkout master 
git pull -s recursive -X patience -X theirs old_repo master 
git pull 

#Push results to Old Repo 
git push origin refs/remotes/old_repo/*:refs/heads/*; 

Bien que cela fonctionne bien s'il n'y a pas des modifications aux branches « Nouveau repo », il échoue lorsque NewRepo a certains commettent qui n'existe pas dans OldRepo (comme CommitB du graphique ci-dessus):

git push origin 'refs/remotes/old_repo/*:refs/heads/*' 
To ssh://<NewRepoServer>/bitbucket_tests 
! [rejected]  old_repo/testBranch -> testBranch (non-fast-forward) 
error: failed to push some refs to     'ssh://<NewRepoServer>/bitbucket_tests' 
hint: Updates were rejected because a pushed branch tip is behind its remote 
hint: counterpart. Check out this branch and integrate the remote changes 
hint: (e.g. 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

Comment puis-je automatiquement mer ge ces changements dans le contenu d'OldRepo automatiquement sans intervention de l'utilisateur?

Répondre

0

J'espère que je vous ai bien compris. Je suppose que la façon la plus simple de gérer cela est d'ajouter une nouvelle/nouvelle branche/branche distante à votre nouveau serveur et d'aller chercher les changements &. Vous aurez donc tous vos engagements et votre histoire. Pour plus d'informations, vous pouvez lire https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

Corrigez-moi si je me trompe.

+0

J'ai eu des problèmes quand j'arrive à tirer toutes les branches de l'ancienne télécommande et à les pousser à l'une d'elles. Que faire si une nouvelle branche apparaît sur l'ancienne télécommande? Quelle séquence de commandes recommanderiez-vous réellement? – viterbi

+0

1. Récupérez et récupérez toutes les modifications de vos anciennes branches distantes dans votre dépôt local avec 'git fetch --all' et 'git pull' 2. Ajoutez votre nouvelle URL distante et poussez vos branches locales vers la nouvelle télécommande avec 'git remote add newRemote URL 'et avec' git remote -v 'vous pouvez vérifier si l'URL de votre nouvelle Remote est correcte. Poussez ensuite vos branches locales vers votre nouvelle télécommande –