Obtener / Empujar todos los repositorys

Estoy tratando de encontrar una forma simple de hacer un git push desde todos los repositorys en una carpeta al mismo time. La razón es que tengo un / var / git con repos sin connection al que presiono sobre SSH, y en otra máquina un ~ / git con repository normal. Esto es lo que quiero que suceda:

  • En mi computadora portátil: duncan@laptop:~/git/someproject> git push [url es server: / var / git / someproject]
  • En mi computadora portátil: duncan@laptop:~/git/anotherthing> git push [url es server: / var / git / anotherrthing]
  • En mi server: duncan@server:/var/git> [...push all repos in this folder...]

Y eso debería empujar todos los repos en esa carpeta a sus respectivos controles remotos. Lo mismo ocurre con la recuperación en el order inverso.

Esperaba que Git tuviera algo integrado (parece que sería un uso común)

No exactamente, ya que Git administra un repository, no repos.

Aunque hay una configuration en la que Git gestiona varios repositorys de forma técnica.

En su server, agregue sus repositorys como submodules en una carpeta separada.

 git init /var/git2 cd /var/git2 git submodule add -b master -- ../git/repo1.git git submodule add -b master -- ../git/repo2.git ... git commit -m "add submodules" git init --bare ../git2bis.git git remote add origin ../git2bis.git git push -u origin master 

Luego, con git 2.7+ en su server (vea " Empuje del submodule Git "):

 cd /var/git2 git config push.recurseSubmodules on-demand 

Entonces, una git submodule update --recurse --remote seguido de un git push empujaría todos los submodules con nuevos commits.

Como puede ver, una forma nativa es intrincada e implica la duplicación de sus repositorys sin protección en su server en un clon no desnudo.

Es mejor tener una secuencia de commands en bucle en los repos sin formatting y presionar si se detectan nuevas confirmaciones (como en " git ls-remote tiene diferentes sha1 como encabezados actuales").

Terminé escribiendo un guión de shell, como lo sugiere la respuesta de werkritter . Este es mi código:

 #!/bin/bash cd /var/git for repo in $(find . -mindepth 1 -maxdepth 1 -type d); do cd /var/git/$repo echo $repo git fetch git push done 

La -mindepth 1 se requiere además de la opción -maxdepth 1 para evitar que find devuelva / var / git. -type d solo devuelve directorys, como para no intentar devolver el file de script.

La razón por la cual no existe una forma nativa fácil o eficiente es porque el propósito de Git es administrar una rep o , no múltiples rep os . Hay una solución nativa que usa submodules, explicada en la respuesta de VonC .

Solo usaría bash junto a git:

 cd ~/git for dir in *; do cd $dir; echo $dir; git push; cd -; done