remota - git push tag
Empuje el repositorio local de Git a un nuevo control remoto que incluya todas las ramas y etiquetas (11)
Aquí hay otra versión de la misma cosa que funcionó mejor para la situación en la que me encontraba. Resuelve el problema donde tiene más de un control remoto, le gustaría clonar todas las sucursales desde el source
remoto hasta el destination
remoto destination
sin tener que verificarlas todas. antemano.
(El problema que tuve con la solución de Daniel fue que se negaría a retirar una rama de seguimiento del control remoto de source
si ya lo había comprobado anteriormente, es decir, no actualizaría mi sucursal local antes del envío)
git push destination +refs/remotes/source/*:refs/heads/*
Nota: Si no está utilizando la CLI directa, debe escapar de los asteriscos:
git push destination +refs/remotes/source//*:refs/heads//*
- @mattalxndr
esto empujará todas las ramas en la source
remota a una rama principal en el destination
, posiblemente haciendo un impulso no hacia adelante. Todavía tienes que empujar las etiquetas por separado.
Tengo un repositorio Git local que me gustaría enviar a un nuevo repositorio remoto (nuevo repositorio creado en Beanstalk, si eso importa). Mi repositorio local tiene algunas ramas y etiquetas y me gustaría conservar toda mi historia. Parece que básicamente solo necesito hacer un empujón de Git, pero eso solo carga la rama maestra. ¿Cómo presiona todo para obtener una réplica completa de mi repositorio local en el control remoto?
Basado en la respuesta de hice:
for remote in /`git branch | grep -v master/`
do
git push -u origin $remote
done
En el caso como yo, usted adquirió un repositorio y ahora está cambiando el origen remoto a un repositorio diferente, uno nuevo vacío ...
Así que tienes tu repo y todas las ramas en el interior, pero aún necesitas revisar esas ramas para que el comando git push --all
realmente empuje esos también.
Debes hacer esto antes de empujar:
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
Seguido por
git push --all
En mi caso lo que funcionó fue.
git push origin --all
Encontré que las respuestas anteriores aún tienen algunas cosas que no están claras, lo que inducirá a error a los usuarios. Primero, es seguro que git push new_origin --all
y git push new_origin --mirror
no puede duplicar todas las ramas de origen, solo duplica las sucursales locales existentes en su new_origin.
A continuación hay dos métodos útiles que he probado:
1, duplicado por clon simple. git clone --bare origin_url
, luego ingrese a la carpeta, y git push new_origin_url --mirror
. De esta manera, también puede usar git clone --mirror origin_url
, tanto --bare
como --mirror
descargarán un repositorio --mirror
, no incluyendo espacio de trabajo. por favor refiera this
2, si tienes un repositorio de git clone
utilizando git clone
, lo que significa que tienes un repositorio simple y el espacio de trabajo de git, puedes usar el git remote add new_origin new_origin_url
y luego git push new_origin +refs/remotes/origin//*:refs/heads//*
, y luego git push new_origin --tags
De esta manera, obtendrás una rama adicional, que no tiene sentido.
Encontré que ninguno de estos parecía funcionar correctamente para mí. Siéntase libre de morir en llamas hasta la muerte, pero por alguna razón no podría hacer que las otras opciones funcionen correctamente.
El resultado esperado fue un repo "clonado" a otro remoto (es decir, de Github a otro proveedor):
- Todas las ramas se crean en el nuevo control remoto
- Todo el historial de sucursales se crea en un nuevo control remoto
- (esto se perdió en todas las soluciones que probé)
- Todas las etiquetas se crean en el nuevo control remoto
- La fuente se mueve sobre (un dado)
- No destructivo (dando pausa a la opción --mirror)
El principal problema que estaba viendo era que las ramas remotas no se recreaban en el nuevo control remoto. Si un comando lo hiciera, el nuevo control remoto no tenía el historial de la rama (es decir, hacer una git checkout branch; git log
no mostraría las confirmaciones de rama esperadas).
Noté que git checkout -b branchname
NO es lo mismo que git checkout branchname
(este último es lo que necesitaba). Me doy cuenta de que git checkout --track branchname
no parece que extraiga el historial de sucursales.
Mi solución (basada en powershell):
Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]
Foreach ($entry in (git branch -r)) {
If ($entry -like "*->*") {
$branch = $entry.split("->")[2].split("/")[1]
}
else {$branch = $entry.split("/")[1]}
Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow
git checkout $branch
Remove-Variable branch -Force
""}
#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}
git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure
Esta es la forma más concisa que he encontrado, siempre que el destino esté vacío. Cambie a una carpeta vacía y luego:
# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git
Sustituya https://...
por file:///your/repo
etc., según corresponda.
Para empujar todas sus sucursales , use cualquiera (reemplace REMOTO con el nombre del remoto, por ejemplo, "origen"):
git push REMOTE ''*:*''
git push REMOTE --all
Para empujar todas tus etiquetas :
git push REMOTE --tags
Finalmente, creo que puedes hacer todo esto en un solo comando con:
git push REMOTE --mirror
Sin embargo, además, --mirror
, también empujará sus controles remotos, por lo que esto podría no ser exactamente lo que desea.
Para empujar ramas y etiquetas (pero no remotos):
git push origin ''refs/tags/*'' ''refs/heads/*''
Esto sería equivalente a combinar las opciones --tags
y --tags
opciones para git push
, que git no parece permitir.
Vale la pena leer la página de manual de git-push
. Combinado con este sitio web , escribí lo siguiente en mi .git/config
:
[remote "origin"]
url = …
fetch = …
push = :
push = refs/tags/*
push = :
significa "push cualquier ramificación ''coincidente'' (es decir, las ramas que ya existen en el repositorio remoto y tienen una contraparte local)", mientras que push = refs/tags/*
significa "push all tags".
Así que ahora solo tengo que ejecutar git push
para empujar todas las ramas coincidentes y todas las etiquetas.
Sí, esto no es exactamente lo que quería el OP (todas las ramas para empujar ya deben existir en el lado remoto), pero puede ser útil para aquellos que encuentran esta pregunta mientras buscan en Google "¿cómo puedo empujar ramas y etiquetas al mismo tiempo?" hora".
Reflejando un repositorio
Crear un clon desnudo del repositorio.
git clone --bare https://github.com/exampleuser/old-repository.git
Espejo-empuje al nuevo repositorio.
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
Elimine el repositorio local temporal que creó en el paso 1.
cd ..
rm -rf old-repository.git
Reflejo de un repositorio que contiene objetos de Git Large File Storage
Crear un clon desnudo del repositorio. Reemplace el nombre de usuario de ejemplo con el nombre de la persona u organización que posee el repositorio, y reemplace el nombre de repositorio de ejemplo con el nombre del repositorio que desea duplicar.
git clone --bare https://github.com/exampleuser/old-repository.git
Navegue hasta el repositorio que acaba de clonar.
cd old-repository.git
Tire de los objetos Git Large File Storage del repositorio.
git lfs fetch --all
Espejo-empuje al nuevo repositorio.
git push --mirror https://github.com/exampleuser/new-repository.git
Inserte los objetos Git Large File Storage del repositorio en su espejo.
git lfs push --all https://github.com/exampleuser/new-repository.git
Elimine el repositorio local temporal que creó en el paso 1.
cd ..
rm -rf old-repository.git
La instrucción anterior proviene de la Ayuda de Github: this