Comment copier des commits d'un repo Git vers un autre?


96

La semaine dernière, j'ai créé un dépôt Github et j'ai oublié de sélectionner une licence pour le dépôt. Maintenant, il y a déjà 3 gros commits.

J'ai demandé aux 3 contributeurs si tout allait bien, si je supprime le repo, puis le crée à nouveau avec le même nom et cette fois en sélectionnant la licence lors de la création du repo, et ils vont bien.

Question

Existe-t-il un moyen d'obtenir les commits dans un nouveau dépôt (cette fois, le premier commit est le fichier LICENSE) tout en conservant les méta-informations de commit?


1
Vous pouvez toujours ajouter une licence au référentiel d'origine. Voir help.github.com/articles/open-source-licensing/… pour plus de détails.
edwinksl

Réponses:


163

Existe-t-il un moyen d'obtenir les commits dans un nouveau dépôt (cette fois, le premier commit est le fichier LICENSE) tout en conservant les méta-informations de commit?

Oui, en ajoutant une télécommande et en sélectionnant les commits en plus de votre premier commit.

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

Le reste de cette réponse est si vous souhaitez toujours ajouter la LICENCE à votre dépôt précédent.

Oui. Vous pouvez placer votre commit LICENSE comme premier commit en rebasant.

Le rebasage est un moyen git de réorganiser l'ordre de validation tout en conservant tous les auteurs et dates de validation intacts.

Lorsque vous travaillez sur un référentiel partagé, il est généralement déconseillé à moins que toute votre équipe ne parle couramment. Pour ceux qui ne le sont pas, ils peuvent simplement cloner une nouvelle copie du référentiel.

Voici comment vous obtenez votre commit LICENCE en tant que premier commit.

1. Mettez à jour et rebasez votre copie locale

Vérifiez votre projet et placez le fichier LICENSE dans un commit AU-DESSUS de votre pile actuelle de 3 commit.

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

Ensuite, effectuez un rebase interactif sur la branche principale pour REARRANGER les validations .

git rebase -i --root

Cela ouvrira un éditeur. Déplacez la ligne du bas (votre commit "Initial commit", le commit le plus récent) en haut du fichier. Puis enregistrez et quittez l'éditeur.

Dès que vous quittez l'éditeur, git écrira les commits dans l'ordre que vous venez de spécifier.

Votre copie locale du référentiel est maintenant mise à jour. faire:

git log

vérifier.

2. Forcer le transfert de votre nouvel état de dépôt vers github

Maintenant que votre copie est mise à jour, vous devez forcer la pousser vers github.

git push -f origin master

Cela indiquera à github de déplacer la branche principale vers son nouvel emplacement. Vous ne devriez forcer le push que dans de rares occasions comme celle-ci où tout le monde travaillant avec lui est au courant du changement en attente, sinon cela déroutera vos collaborateurs.

3. Synchronisez les collaborateurs avec github

Enfin, tous les collaborateurs devront se synchroniser avec ce référentiel.

Tout d'abord, ils doivent avoir des référentiels propres car la commande suivante peut être destructrice s'il y a des modifications non enregistrées.

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

C'est tout. Tout le monde devrait être synchronisé maintenant.


1
Très bonne réponse! Merci!
Kyrol

Gain de temps. Merci!
an0nh4x0r

9

J'ai eu un problème similaire où j'ai oublié de fourcher un repo sur mon github et ajouté plusieurs commits avant de réaliser mon erreur.

J'ai trouvé une solution assez simple.

Retirez d'abord la télécommande du référentiel d'origine

git remote remove origin

Deuxièmement, ajoutez une télécommande à la nouvelle fourche sur mon github

git remote add origin <my repo URL>

Ensuite, j'ai poussé vers le maître d'origine et tous mes commits sont apparus sur mon github.


1
Juste pour ajouter à cela, quand j'ai poussé, je devais le faire git push --set-upstream origin master, mais Git vous en fait prendre conscience.
MRichards

solution excellente et facile!
mécographe du

3
  • Destination Git = UrlD (le contenu existant n'a pas d'importance)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

Maintenant, la destination aura les mêmes données que la source (vous pouvez également utiliser l'origine au lieu de l'origine2)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.