remove - git tags best practices
tirar/empujar desde mĂșltiples ubicaciones remotas (14)
El resumen: ¿hay una manera de hacer que un repositorio de git se presione y se extraiga de una lista de repositorios remotos (en lugar de un solo "origen")?
Largo: a menudo tengo una situación cuando desarrollo una aplicación en varias computadoras, con conectividad diferente, por ejemplo, una computadora portátil en tránsito, una computadora "A" mientras estoy en una ubicación determinada y otra computadora "B "mientras que en otro. Además, la computadora portátil puede tener conectividad solo con "A" o "B", y algunas veces con ambas.
Lo que me gustaría es que git siempre "tire" y "empuje" a todas las computadoras a las que se puede conectar actualmente, por lo que es más fácil saltar de una máquina a otra y continuar trabajando sin problemas.
Añadiendo nuevo control remoto
git remote add upstream https://github.com/example-org/example-repo.git
git remote -vv
Obtener múltiples ubicaciones
git fetch --all
Empujar a lugares
git push -u upstream/dev
Agregar all
control remoto se vuelve un poco tedioso, ya que debe configurarlo en cada máquina que use.
Además, los alias de bash
y git
siempre que todos asuman que usted tendrá que empujar a todos los controles remotos. (Por sshag
tengo una bifurcación de sshag
que mantengo en github y gitlab. He agregado el control remoto ascendente , pero no tengo permiso para hacerlo).
Aquí hay un alias de git
que solo empuja a los controles remotos con una url de inserción que incluye @
.
psall = "!f() { / for R in $(git remote -v | awk ''/@.*push/ { print $1 }''); do / git push $R $1; / done / }; f"
Agregué dos pushurl separados al "origen" remoto en el archivo conggig .git. Cuando ejecuto git push origin "branchName"
, se ejecutará y se enviará a cada url. No estoy seguro de si hay una forma más fácil de lograr esto, pero esto funciona para mí mismo al ingresar al código fuente de Github y al código fuente de My.visualStudio al mismo tiempo.
[remote "origin"]
url = "Main Repo URL"
fetch = +refs/heads/*:refs/remotes/origin/*
pushurl = "repo1 URL"
pushurl = "reop2 URl"
Agregué estos alias a mi ~ / .bashrc:
alias pushall=''for i in `git remote`; do git push $i; done;''
alias pullall=''for i in `git remote`; do git pull $i; done;''
Aquí está mi ejemplo con el script bash dentro de la sección de alias .gitconfig
[alias]
pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
La última versión de git (a partir de octubre de 2012) le permite hacer esto desde la línea de comandos:
git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v
Luego, git push
presionará a user1 @ repo1, luego presionará a user2 @ repo2. Deje afuera - --push
si también quiere poder git pull
de ellos.
Me tomé la libertad de ampliar la answer desde nona-urbiz; solo agrega esto a tu ~ / .bashrc:
git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }
alias git-pullall=git-pullall
git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall
Uso:
git-pullall master
git-pushall master ## or
git-pushall
Si no proporciona ningún argumento de bifurcación para git-pullall, la extracción de los controles remotos no predeterminados fallará; Dejó este comportamiento como está, ya que es análogo a git.
Necesitarás un script para recorrerlos. Git no proporciona un "empuje todo". Teóricamente, podría hacer una inserción en varios subprocesos, pero un método nativo no está disponible.
Fetch es aún más complicado, y recomendaría hacerlo de forma lineal.
Creo que su mejor respuesta es tener una máquina a la que todos presionen / tiren, si es posible.
Para actualizar los controles remotos (es decir, el caso de pull
), las cosas se han vuelto más fáciles.
La declaración de Linus
Lamentablemente, ni siquiera hay una manera de falsificar esto con un alias de git.
en la entrada referida en la lista de correo de Git en la respuesta de elliottcable ya no es cierto.
git fetch
aprendió el parámetro --all
en algún lugar del pasado que permite recuperar todos los controles remotos de una sola vez.
Si no se solicitan todos, se podría usar el interruptor --multiple
para especificar varios controles remotos o un grupo.
Puedes agregar mandos a distancia con:
git remote add a urla
git remote add b urlb
Luego, para actualizar todos los repos.
git remote update
Puedes configurar múltiples repositorios remotos con el comando git remote
:
git remote add alt alt-machine:/path/to/repo
Para obtener de todos los controles remotos configurados y las ramas de seguimiento de actualización, pero no fusionar en HEAD, haga:
git remote update
Si no está conectado actualmente a uno de los controles remotos, tomará un tiempo de espera o lanzará un error, y continuará con el siguiente. Tendrá que fusionarse manualmente desde los repositorios obtenidos, o cherry-pick, dependiendo de cómo quiera organizar los cambios de recolección.
Para obtener la rama maestra de alt y colocarla en tu cabeza actual, haz:
git pull alt master
Entonces, de hecho, git pull
es casi una abreviatura de git pull origin HEAD
(en realidad se ve en el archivo de configuración para determinar esto, pero se entiende la idea).
Para impulsar actualizaciones, tienes que hacer eso en cada repo manualmente. Creo que un empuje fue diseñado teniendo en cuenta el flujo de trabajo del repositorio central.
Quería trabajar en VSO / TFS, y luego empujar públicamente a GitHub cuando esté listo. Repo inicial creado en VSO privado. Cuando llegó el momento de agregar a GitHub hice:
git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master
Trabajó como un campeón ...
Para una verificación de validez, emita "git remote -v" para enumerar los repositorios asociados con un proyecto.
C:/dev/kinect/vso-repo-k2work/FaceNSkinWPF>git remote -v
githubrepo https://github.com/jhealy/kinect2.git (fetch)
githubrepo https://github.com/jhealy/kinect2.git (push)
origin https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch)
origin https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push)
De manera simple, funcionó para mí ... Espero que esto ayude a alguien.
agregue un alias a gitconfig global (/home/user/.gitconfig) con el siguiente comando.
git config --global alias.pushall ''!f(){ for var in $(git remote show); do echo "pushing to $var"; git push $var; done; }; f''
Una vez que ingresas el código, decimos
git push
para empujar a origen por defecto. Después del alias anterior, podemos decir
git pushall
y el código se actualizará a todos los controles remotos, incluido el origen remoto.
¡Hacer esto manualmente ya no es necesario , con versiones modernas de git
! Ver la solución de Malvineous , a continuación.
Reproducido aquí:
git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>
Respuesta original:
Este algo que he estado usando durante bastante tiempo sin malas consecuencias y sugerido por Linus Torvalds en la lista de correo de git .
La solución de araqnid es la adecuada para llevar el código a su repositorio ... pero cuando usted, como yo, tenemos múltiples flujos ascendentes autorizados equivalentes (mantengo algunos de mis proyectos más críticos clonados tanto en un upstream privado, GitHub y Codaset), Puede ser un dolor empujar cambios a cada uno, todos los días.
En pocas palabras, git remote add
todos tus controles remotos individualmente ... y luego git config -e
y agrega un control remoto combinado. Suponiendo que tiene esta config
repositorio:
[remote "GitHub"]
url = [email protected]:elliottcable/Paws.o.git
fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
remote = GitHub
merge = refs/heads/Master
[remote "Codaset"]
url = [email protected]:elliottcable/paws-o.git
fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
url = [email protected]:Paws/Paws.o.git
fetch = +refs/heads/*:refs/remotes/Paws/*
... para crear un remoto combinado para "Paws"
y "Codaset"
, puedo agregar lo siguiente después de todos esos:
[remote "Origin"]
url = [email protected]:Paws/Paws.o.git
url = [email protected]:elliottcable/paws-o.git
Una vez que haya hecho esto, cuando haya git push Origin Master
, se enviará secuencialmente a Paws/Master
y Codaset/Master
, haciendo la vida un poco más fácil.