web-dev-qa-db-fra.com

Comment copier des commits d'un dépôt Git à un autre?

La semaine dernière, j'ai créé un dépôt Github et 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 va bien, si je supprime le référentiel, puis le crée à nouveau avec le même nom et cette fois en sélectionnant la licence lors de la création du référentiel, et ils savent très bien quoi.

Question

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

32
Jasmine Lognnes

Existe-t-il un moyen d'obtenir les validations dans un nouveau référentiel (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 par-dessus 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 précédent dépôt.

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

Le changement de base est un moyen génial de réorganiser l'ordre de validation tout en conservant intacts tous les auteurs et les dates de validation.

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

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

1. Mettez à jour et redéfinissez votre copie locale

Vérifiez votre projet et placez le fichier LICENSE dans un commit EN DEBUT de votre pile actuelle de 3 commit.

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

Faites ensuite une rebase interactive sur la branche principale versRÉARRANGEles commits.

git rebase -i --root

Il va ouvrir un éditeur. Déplacez la ligne du bas (votre commit "Commit initial", le plus récent) vers le 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.

Vous avez maintenant votre copie locale du référentiel mise à jour. faire:

git log

vérifier.

2. Force Poussez votre nouvel état de repo à github

Maintenant que votre copie est mise à jour, vous devez forcer Push to github.

git Push -f Origin master

Cela indiquera à github de déplacer la branche principale vers son nouvel emplacement . Vous ne devez forcer Push que dans de rares occasions comme celle-ci, où tous ceux qui travaillent avec elle sont au courant du changement en attente, sans quoi cela dérouterait vos collaborateurs.

3. Synchronisez les collaborateurs avec github

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

D'abord ils doivent avoir des référentiels propres car la commande suivante peut être destructive 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.

54
Moocowmoo

J'ai eu un problème similaire où j'ai oublié de débiter un repo dans mon github et j'ai ajouté plusieurs commits avant de me rendre compte de mon erreur.

J'ai trouvé une solution assez simple.

Commencez par retirer la télécommande du rapport d'origine 

git remote remove Origin

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

git remote add Origin <my repo URL>

Puis j'ai poussé sur Origin Master et tous mes commits sont apparus sur mon github.

0
Russ Bain
  • 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 Origin au lieu de Origin2)

0
Blue Clouds