Come copiare i commit da un repository Git a un altro?


96

La scorsa settimana ho creato un repository Github e ho dimenticato di selezionare una licenza per il repository. Ora ci sono già 3 grandi commit.

Ho chiesto ai 3 contributori se va bene, se elimino il repository e poi lo creo di nuovo con lo stesso nome e questa volta selezionando la licenza durante la creazione del repository, e loro vanno bene.

Domanda

C'è un modo per ottenere i commit in un nuovo repository (questa volta il primo commit è il file LICENSE) e mantenere comunque le meta info del commit?


1
È comunque possibile aggiungere una licenza al repository originale. Vedi help.github.com/articles/open-source-licensing/… per i dettagli.
edwinksl

Risposte:


163

C'è un modo per ottenere i commit in un nuovo repository (questa volta il primo commit è il file LICENSE) e mantenere comunque le meta info del commit?

Sì, aggiungendo un telecomando e selezionando i commit in cima al tuo primo 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

Il resto di questa risposta è se vuoi ancora aggiungere la LICENZA al tuo repository precedente.

Sì. Puoi posizionare il tuo commit LICENSE come primo commit ribasando.

Il rebasing è un modo gits di riorganizzare l'ordine dei commit mantenendo intatti tutti gli autori e le date di commit.

Quando si lavora su un repository condiviso, è generalmente sconsigliato a meno che l'intero team non sia fluente con git. Per quelli che non lo sono, possono semplicemente clonare una nuova copia del repository.

Ecco come ottenere il tuo impegno di LICENZA come primo impegno.

1. Aggiorna e ridisegna la tua copia locale

Controlla il tuo progetto e posiziona il file LICENSE in un commit SOPRA il tuo attuale stack di 3 commit.

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

Quindi esegui un rebase interattivo sul ramo master per REARRANGE i commit.

git rebase -i --root

Si aprirà un editor. Spostare l'ultima riga (il commit "Initial commit", il commit più recente) all'inizio del file. Quindi salva e chiudi l'editor.

Non appena esci dall'editor, git scriverà i commit nell'ordine appena specificato.

Ora hai aggiornato la tua copia locale del repository. fare:

git log

verificare.

2. Forza il push del nuovo stato del repository su GitHub

Ora che la tua copia è aggiornata, devi forzare il push su GitHub.

git push -f origin master

Questo dirà a github di spostare il ramo principale nella sua nuova posizione. Dovresti forzare il push solo in rare occasioni come questa in cui tutti coloro che ci lavorano sono consapevoli del cambiamento in sospeso, altrimenti confonderà i tuoi collaboratori.

3. Sincronizza i collaboratori su GitHub

Infine, tutti i collaboratori dovranno sincronizzarsi con questo repository.

Per prima cosa devono avere repository puliti poiché il seguente comando può essere distruttivo se ci sono modifiche non salvate.

# 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

Questo è tutto. Tutti dovrebbero essere sincronizzati ora.


1
Bella risposta! Grazie!
Kyrol

Risparmiato molto tempo. Grazie!
an0nh4x0r

9

Ho avuto un problema simile in cui ho dimenticato di fare il fork di un repository sul mio GitHub e ho aggiunto diversi commit prima di rendermi conto del mio errore.

Ho trovato una soluzione piuttosto semplice.

Per prima cosa rimuovi il telecomando dal repository originale

git remote remove origin

Secondo, aggiungi un telecomando al nuovo fork sul mio GitHub

git remote add origin <my repo URL>

Poi sono passato a origin master e tutti i miei commit sono stati visualizzati sul mio GitHub.


1
Solo per aggiungere a questo, quando ho spinto, dovevo farlo git push --set-upstream origin master, ma Git te ne rende conto.
MRichards

ottima e facile soluzione!
mecografo

3
  • Destination Git = UrlD (il contenuto esistente non ha importanza)
  • SourceGit = UrlS

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

Ora la destinazione avrà gli stessi dati dell'origine (puoi anche usare l'origine invece di l'origine2)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.