Como copiar commits de um repositório Git para outro?


96

Na semana passada, criei um repositório Github e esqueci de selecionar uma licença para o repositório. Agora já existem 3 grandes commits.

Eu perguntei aos 3 contribuidores se está tudo bem, se eu deletar o repo e então criá-lo novamente com o mesmo nome e desta vez selecionando a licença ao criar o repo, e eles estavam bem o que isso.

Questão

Existe uma maneira de obter os commits em um novo repo (desta vez, o primeiro commit é o arquivo LICENSE) e ainda manter as meta informações do commit?


1
Você ainda pode adicionar uma licença ao repo original. Consulte help.github.com/articles/open-source-licensing/… para obter detalhes.
edwinksl

Respostas:


163

Existe uma maneira de obter os commits em um novo repo (desta vez, o primeiro commit é o arquivo LICENSE) e ainda manter as meta informações do commit?

Sim, adicionando um controle remoto e escolhendo os commits no topo de seu primeiro 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

O restante desta resposta é se você ainda deseja adicionar a LICENÇA ao seu repo anterior.

Sim. Você pode colocar seu commit de LICENÇA como o primeiro commit por rebasing.

Rebasing é uma maneira de reorganizar a ordem de commit, mantendo todos os autores e datas de commit intactos.

Ao trabalhar em um repositório compartilhado, geralmente é desencorajado, a menos que toda a sua equipe seja fluente no git. Para aqueles que não são, eles podem simplesmente clonar uma nova cópia do repositório.

Veja como você obtém seu commit de LICENÇA como o primeiro commit.

1. Atualize e rebase sua cópia local

Verifique seu projeto e coloque o arquivo LICENSE em um commit NO TOPO de sua pilha de 3 commits atuais.

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

Em seguida, faça um rebase interativo no branch master para REARRANGE os commits.

git rebase -i --root

Isso abrirá um editor. Mova a linha inferior (seu commit de "commit inicial", o commit mais recente) para o topo do arquivo. Em seguida, salve e feche o editor.

Assim que você sair do editor, o git escreverá os commits na ordem que você acabou de especificar.

Agora você tem sua cópia local do repositório atualizada. Faz:

git log

verificar.

2. Force o envio de seu novo estado de repo para o github

Agora que sua cópia está atualizada, você deve forçar o envio para o github.

git push -f origin master

Isso dirá ao github para mover o branch master para seu novo local. Você só deve forçar o push em raras ocasiões como esta em que todos que trabalham com ele estão cientes da mudança pendente, caso contrário, isso confundirá seus colaboradores.

3. Sincronize os colaboradores com o github

Por último, todos os colaboradores deverão sincronizar com este repositório.

Primeiro, eles devem ter repositórios limpos, pois o comando a seguir pode ser destrutivo se houver alterações não salvas.

# 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

É isso aí. Todos devem estar em sincronia agora.


1
Ótima resposta! Obrigado!
Kyrol

Economizei muito tempo. Obrigado!
an0nh4x0r

9

Tive um problema semelhante em que esqueci de fazer um fork de um repositório para meu github e adicionei vários commits antes de perceber meu erro.

Eu encontrei uma solução bem simples.

Primeiro remova o controle remoto para o repositório original

git remote remove origin

Em segundo lugar, adicione um controle remoto ao novo fork no meu github

git remote add origin <my repo URL>

Então eu empurrei para o master de origem e todos os meus commits apareceram no meu github.


1
Só para adicionar a isso, quando eu empurrei, eu tinha que fazer git push --set-upstream origin master, mas Git deixa você ciente disso.
MRichards

solução ótima e fácil!
mecógrafo

3
  • Destino Git = UrlD (o conteúdo existente não importa)
  • SourceGit = UrlS

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

Agora, o destino terá os mesmos dados da fonte (você também pode usar origem em vez de origin2)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.