¿Cómo copiar confirmaciones de un repositorio de Git a otro?


96

La semana pasada creé un repositorio de Github y olvidé seleccionar una licencia para el repositorio. Ahora ya hay 3 grandes confirmaciones.

Le pregunté a los 3 contribuyentes si estaba bien, si borro el repositorio y luego lo creo de nuevo con el mismo nombre y esta vez seleccionando la licencia al crear el repositorio, y están bien.

Pregunta

¿Hay alguna forma de obtener las confirmaciones en un nuevo repositorio (esta vez, la primera confirmación es el archivo LICENCIA) y aún así mantener la metainformación de la confirmación?


1
Aún puede agregar una licencia al repositorio original. Consulte help.github.com/articles/open-source-licensing/… para obtener más detalles.
edwinksl

Respuestas:


163

¿Hay alguna forma de obtener las confirmaciones en un nuevo repositorio (esta vez, la primera confirmación es el archivo LICENCIA) y aún así mantener la metainformación de la confirmación?

Sí, agregando un control remoto y seleccionando las confirmaciones además de su primera confirmación.

# 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

El resto de esta respuesta es si aún desea agregar la LICENCIA a su repositorio anterior.

Si. Puede colocar su confirmación de LICENCIA como la primera confirmación cambiando la base.

Rebasing es una forma de git de reorganizar el orden de las confirmaciones mientras se mantienen intactos todos los autores de las confirmaciones y las fechas de las confirmaciones.

Cuando se trabaja en un repositorio compartido, generalmente se desaconseja a menos que todo su equipo sea fluido en git. Para aquellos que no lo están, pueden simplemente clonar una copia nueva del repositorio.

Así es como obtiene su confirmación de LICENCIA como la primera confirmación.

1. Actualice y reajuste su copia local

Consulte su proyecto y coloque el archivo LICENCIA en una confirmación EN LA PARTE SUPERIOR de su pila de 3 confirmaciones actual.

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

Luego haga una rebase interactiva en la rama maestra para REORDENAR las confirmaciones.

git rebase -i --root

Abrirá un editor. Mueva la línea inferior (su confirmación de "confirmación inicial", la confirmación más reciente) a la parte superior del archivo. Luego guarde y salga del editor.

Tan pronto como salga del editor, git escribirá las confirmaciones en el orden que acaba de especificar.

Ahora tiene su copia local del repositorio actualizada. hacer:

git log

para verificar.

2. Forzar el envío de su nuevo estado de repositorio a github

Ahora que su copia está actualizada, debe forzar la inserción a github.

git push -f origin master

Esto le dirá a github que mueva la rama maestra a su nueva ubicación. Solo debe forzar el impulso en raras ocasiones como esta, en las que todos los que trabajan con él están al tanto del cambio pendiente, de lo contrario confundirá a sus colaboradores.

3. Sincronizar colaboradores con github

Por último, todos los colaboradores deberán sincronizarse con este repositorio.

Primero , deben tener repositorios limpios ya que el siguiente comando puede ser destructivo si hay cambios sin guardar.

# 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

Eso es. Todo el mundo debería estar sincronizado ahora.


1
¡Gran respuesta! ¡Gracias!
Kyrol

Ahorró mucho tiempo. ¡Gracias!
an0nh4x0r

9

Tuve un problema similar en el que olvidé bifurcar un repositorio en mi github y agregué varias confirmaciones antes de darme cuenta de mi error.

Encontré una solución bastante simple.

Primero retire el control remoto al repositorio original

git remote remove origin

En segundo lugar, agregue un control remoto a la nueva bifurcación en mi github

git remote add origin <my repo URL>

Luego empujé al maestro de origen y todas mis confirmaciones aparecieron en mi github.


1
Solo para agregar a esto, cuando presioné, tenía que hacerlo git push --set-upstream origin master, pero Git te hace consciente de esto.
MRichards

¡gran y fácil solución!
mecógrafo

3
  • Destino Git = UrlD (el contenido existente no importa)
  • SourceGit = UrlS

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

Ahora, el destino tendrá los mismos datos que la fuente (también puede usar origen en lugar de origen2)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.