管理多个Git仓库

118

在 Git 中设置项目非常容易,因此我甚至可以为小脚本设置单独的存储库。现在的问题是如何管理它们。

我在多个地方使用这些存储库。当我对某些存储库进行更改时,我希望能够更新其他位置的存储库。

因此,我有一个包含许多存储库的目录。

  1. 如何获取所有存储库?
  2. 如何检查它们中是否有任何未提交的更改?
  3. 如何检查它们中是否有需要合并的更改?

最好能够用一个命令完成这些操作。

输出需要足够简洁,以便注意到需要处理的事项。


相同的问题已经为 hg mercurial 回答 - Serge Stroobandt
2
注意:自Git 2.30(2020年第四季度)起,您现在可以使用新的git for-each-repo命令。 - VonC
1
@sesm 你应该能够在 git for-each-repo 循环中运行 git rev-parse --git-dir 命令序列:这将显示每个存储库的根文件夹。 - VonC
1
@sesm 你可以运行 git for-each-repo --config=<config> -- xxx args:这将在 $PATH 中查找 git-xxx 可执行文件,其中你可以放置任意数量的逗号。 - VonC
@sesm 很棒,干得好! - VonC
显示剩余5条评论
26个回答

1

有一个方便的工具可以获取所有多个存储库。

git-pull-all 是一个命令行工具,可异步地在多个 git 存储库上执行。

安装

npm install -g git-pull-all

使用方法

假设您拥有以下文件和目录:

~/Projects/
  cool-examples/
    .git/
  funny-movies/
  my-todos.txt
  super-express/
    .git/

当您在~/Projects目录下运行git-pull-all命令时,它应该找到子Git存储库(在上述情况下为cool-examplessuper-express),然后对每个存储库执行git pull命令。
$ cd ~/Projects
$ git-pull-all
funny-movies/
Not a git repository
cool-examples/
Already up-to-date.
super-express/
Already up-to-date.
Done!

git-pull-all ~/Projects

GitHub链接: https://github.com/tatsuyaoiw/git-pull-all


1
请尝试使用gitas

gitas status

git status 标志:

  -t, --time           time of last commit shown (default true)
  -f, --format {r|i}   format time: relative|iso (default r)
  -b, --branch         branch shown
  -q, --query          query fetch needed (implies -br)
  -r, --remote         remote shown
  -l, --url            url shown
  -d, --dirty          dirty shown (default true)
  -u, --untracked      untracked shown
  -s, --stash          stash shown
  -o, --order {t|n}    order: time|name (default t)
  -e, --emit {t|j|m}   emit format: table|json|markdown (default t)
  -h, --help           help for status

0
请按照以下步骤从所有存储库中获取代码:
  1. 使用扩展名为 .bat 创建一个新文件
  2. 将该文件放置在您拥有所有存储库文件夹的同一层次结构中
  3. 编辑 .bat 文件并添加以下脚本
FOR /D %%G in (%cd%\*) Do cd %%G & call git branch & call git pull & cd ..
echo All code pulled successfully!!
pause

保存文件,然后双击开始拉取你的代码。

0
我使用代码编辑器(VS Code)的多光标选择/多行编辑功能来创建批处理/Shell脚本,并一次性执行它。通过这个简单愚蠢的解决方案,我知道自己在做什么,以及可以从这些命令的执行中期待什么。没有猜测,没有学习,也不需要自定义。另一个原因是,每次我想要在位于共同父目录中的不同存储库集上执行命令时。

-1

https://github.com/wwjamieson3/envisionTools有一个名为gitstat的bash脚本,可以实现这个功能以及更多。它是GNU和mac兼容的。如果需要,它可以从远程执行获取操作。它显示未跟踪、修改、添加、删除和暂存的文件。通过显示远程未合并的提交和本地未推送的提交,它与远程进行差异比较。它还可以在摘要或详细模式下甚至HTML中显示彩色编码结果。它使用locate而不是find,因为它速度无限快,并且甚至会提示更新您的locate数据库(如果它过时了)。


2
感谢您发布答案!请务必仔细阅读有关自我推广的FAQ。还请注意,每次链接到您自己的网站/产品时,必须发布免责声明。 - Andrew Barber
3
很遗憾,github上wwjamieson3/envisionTools的链接已经失效。 - Brenda J. Butler
@williamJamieson 是 envisionTools 的私有 GitHub 存储库吗? - eebbesen

-9

看起来编写一个脚本来完成这个任务非常容易。基本上,它需要遍历存储库,然后使用像git ls-files、git diff和git log这样的命令。


我知道现在有点晚了,但你能发布一下这个脚本吗? - l0b0
没有所谓的“脚本”。我正在使用我为自己需要编写的脚本,但它不是通用的。 - iny
如果你想要得到一个可以使用单个补丁命令撤销和重新应用的单个差异文件,那么“git diff”实际上是棘手的。 - proski
13
除了这个答案,任何一个答案都可以被接受作为正确答案。 - Kennet Celeste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接