获取/推送所有存储库



我正在尝试找到一种简单的方法来同时从文件夹中的所有存储库进行git push。原因是我有一个带有裸存储库的/var/git,我通过 SSH 推送到它,而在另一台机器上有一个带有普通存储库的 ~/git。以下是我想要发生的事情:

  • 在我的笔记本电脑上:duncan@laptop:~/git/someproject> git push [url is server:/var/git/someproject]
  • 在我的笔记本电脑上:duncan@laptop:~/git/anotherthing> git push [url is server:/var/git/otherthing]
  • 在我的服务器上:duncan@server:/var/git> [...push all repos in this folder...]

这应该将该文件夹中的所有存储库推送到各自的远程。相反顺序的获取也是如此。

我希望 Git 内置了一些东西(似乎这是一种常见的用法)

不完全是,因为 Git 管理存储库,而不是存储库。

尽管有一种配置,Git 在技术上管理多个存储库。

在服务器上,将存储库作为子模块添加到单独的文件夹中。

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 子模块推送"):

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

然后,一个git submodule update --recurse --remote然后是一个 git 推送,将使用新的提交推送所有子模块。

如您所见,本机方式很复杂,涉及在非裸克隆中复制服务器上的裸存储库。

最好有一个脚本在裸存储库上循环,并在检测到新提交时推送(如" git ls-remote具有不同的sha1作为当前头")。

我只会在git一起使用bash:

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

我最终编写了一个 shell 脚本,正如韦克里特的回答。这是我的代码:

#!/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

除了 -maxdepth 1 选项之外,还需要-mindepth 1,以防止 find 返回/var/git 本身。 -type d只返回目录,例如不尝试返回脚本文件。

没有简单或有效的本机方式的原因是因为 Git 的目的是管理一个代表而不是多个代表操作系统。有一个使用子模块的本机解决方案,在 VonC 的答案中进行了解释。

最新更新