获取/推送所有存储库

时间:2016-02-07 03:54:34

标签: git version-control

我试图找到一种简单的方法同时从文件夹中的所有存储库执行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...]

这应该将该文件夹中的所有存储库推送到各自的遥控器。同样以相反的顺序获取。

3 个答案:

答案 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