2016-05-26 16 views
14

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.Come copiare i commit da un repository Git a un altro?

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

Domanda

C'è un modo ho ottenere i commit nel nuovo pronti contro termine (questa volta il primo commit è il file di licenza) e ancora mantenere il commit meta informazioni?

+1

È ancora possibile aggiungere una licenza al repository originale. Vedi https://help.github.com/articles/open-source-licensing/#how-can-i-go-back-through-my-public-repositories-and-give-them-licenses per i dettagli. – edwinksl

+0

Possibile duplicato di [git: applica le modifiche introdotte dal commit in un repository a un altro repository] (http://stackoverflow.com/questions/3816040/git-apply-changes-introduced-by-commit-in-one-repo- to-another-repo) –

risposta

26

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

Sì, aggiungendo una selezione remota e selezionabile in cima al 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 --abbrev-commit 

# 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 si vuole ancora aggiungere la licenza al vostro repo precedente.

Sì. È possibile inserire il commit LICENZA come primo commit mediante una re-assegnazione.

Il rebasso è un modo per riorganizzare l'ordine di commit mantenendo intatti tutti gli autori di commit e le date di commit.

Quando si lavora su un repository condiviso, è generalmente scoraggiato a meno che l'intera squadra non sia git-fluente. Per quelli che non lo sono, possono semplicemente clonare una nuova copia del repository.

Ecco come viene eseguito il commit della LICENZA come prima commit.

1. Aggiornamento e rebase la copia locale

Partenza il progetto e posizionare il file di licenza un commit in cima al vostro stack corrente 3 commettere.

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

Poi fare un rebase interattivo sul ramo master per riorganizzare i commit.

git rebase -i --root 

Si aprirà un editor. Sposta la riga inferiore (il commit "Initial commit", il commit più recente) nella parte superiore del file. Quindi salva ed esci dall'editor.

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

Ora è stata aggiornata la copia locale del repository. fare:

git log 

da verificare.

2. Forza spingere il vostro nuovo stato di pronti contro termine a GitHub

Ora che la copia è aggiornato, si deve per forza spingerlo a github.

git push -f origin master 

Ciò consentirà a github di spostare il ramo master nella nuova posizione. Dovresti forzare il push solo in rare occasioni come questa in cui tutti quelli che lavorano con esso sono consapevoli del cambiamento in sospeso, altrimenti confonderanno i tuoi collaboratori.

3. collaboratori Sincronizza a GitHub

Infine, tutti i collaboratori dovranno sincronizzarsi con questo repository.

In primo luogo devono avere repository puliti come 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.

Problemi correlati