我试图找到一种简单的方法同时从文件夹中的所有存储库执行git push
。原因是我有一个/ var / git与裸repos我推到SSH,而在另一台机器上有一个〜/ git与正常的repos。这就是我想要发生的事情:
duncan@laptop:~/git/someproject> git push
[网址为服务器:/ var / git / someproject] duncan@laptop:~/git/anotherthing> git push
[网址为服务器:/ var / git / anotherthing] duncan@server:/var/git> [...push all repos in this folder...]
这应该将该文件夹中的所有存储库推送到各自的遥控器。同样以相反的顺序获取。
答案 0 :(得分:2)
我曾希望Git内置一些东西(这似乎是一种常见用法)
不完全是,因为Git管理 a repo,而不是回购。
虽然有一种配置,Git在技术上管理多个回购。
在您的服务器上,将您的repos作为子模块添加到单独的文件夹中。
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
然后,使用服务器上的git 2.7+(请参阅“Git submodule push”):
cd /var/git2
git config push.recurseSubmodules on-demand
然后,git submodule update --recurse --remote
后跟git push会推送所有子模块进行新的提交。
正如您所看到的,原生方式是复杂的,并且涉及在非裸克隆中复制您的服务器上的裸存储库。
最好让一个脚本在裸存储库上循环,并在检测到新提交时推送(如“git ls-remote
中有不同的sha1作为当前头”)。
答案 1 :(得分:2)
我最终编写了一个shell脚本,如下所述 werkritter's回答。这是我的代码:
#!/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
除-mindepth 1
选项外,还需要-maxdepth 1
,以防止find返回/ var / git本身。 -type d
仅返回目录,例如不尝试返回脚本文件。
没有简单或有效的原生方式的原因是因为Git的目的是管理 a rep o ,而不是多个 rep os 。 是使用子模块的原生解决方案,在VonC's答案中有解释。
答案 2 :(得分:1)
我只是和git一起使用bash:
cd ~/git
for dir in *; do cd $dir; echo $dir; git push; cd -; done