递归检查git目录更新

6
我想知道是否有一种方法可以确定指定目录下的哪些子文件夹是git项目。之后,检查这些git项目中哪些需要通过'git fetch'或其他方式进行更新。
例如,我在我的主文件夹中有一个名为development的文件夹,其中包含各种项目,其中大约10%使用git。我希望能够运行一个命令,以便检查development目录中所有git文件夹的任何更新,而不是单独检查每个项目的更新情况。
如果它可以更新非冲突项目,那将很好。
4个回答

5

获取当前目录下所有Git仓库的列表的一种方法是使用以下命令:

find . -name '.git' | xargs -n 1 dirname

您可以将此内容输入shell脚本中,在每个代码库中运行所需的命令,可以通过进入目录或使用Git的--git-dir--work-tree参数来实现。


你能解释一下xargs命令中的-n参数吗?我看了手册,但仍不确定它的功能。 - Emmanuel M. Smith
@MrAxilus xargs通常将所有输出用作指定命令行参数的命令(在我们的情况下是dirname)。-n要求将所有输入的1个单词片段拆分并为每个片段调用dirname。 - Oleksandr Pryimak
@AlexandrPriymak,我明白了。使用find的-exec参数会更好吗? - Emmanuel M. Smith
@MrAxilus 感谢您的提示。-exec选项非常棒。 - Oleksandr Pryimak
更新后的命令是 "find . -name '.git' -exec dirname '{}' ;",不用引号。 - Emmanuel M. Smith
找到当前目录下所有名为“.git”的文件夹,并将它们的上级目录路径输出。 - MrSwed

3
这是一个(有点取巧的)一行代码解决方案: ```

这里是一行代码:

```
back=`pwd`; for d in `find . -type d -name .git` ; do cd "$d/.."; git pull ; cd $back ; done

2
简言之:
find . -name .git -execdir git pull -v ';'

您可以创建以下脚本(例如update_src.sh):
#!/bin/sh
# Script to pull all git repositories to the recent version.
ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
find "$ROOT" -name .git -type d -execdir git pull -v ';'

或在shell中创建以下别名:

alias git-pull-all='find $(git rev-parse --show-toplevel 2> /dev/null) -name .git -type d -execdir git pull -v ";"'

或者在您的~/.gitconfig文件中。


1

看一下安卓的repo。我认为里面没有任何安卓特定的内容,你可以根据自己的需求进行调整。


嗯,repo到底有什么git没有的功能呢? - Emmanuel M. Smith

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