我在一个目录下有多个 git 存储库,我想知道 git 中是否有一些功能可以迭代每个目录,检查是否有任何未提交的更改并向我报告?
我可以每天早上运行它以确保一切都是最新的。
只是有一天,我会使用多个存储库,并且会忘记提交更改,当我后来意识到要提交更改时,这可能会导致冲突。
克里斯
Andy是对的(在评论中):如果父目录本身就是父存储库的根目录,所有子目录都是子目录,那么 git status 可以检测其中之一的任何更改。
git diff
git submodule foreach --recursive git diff --name-status
如果没有子模块,请参阅“git:在目录树中查找所有未提交的本地存储库”中的脚本解决方案。
我为此编写了一个命令行工具gita。它可以显示所有存储库的状态,包括编辑状态、与远程分支的关系等。它还可以从任何工作目录批量执行命令。
您还可以对存储库进行分组。对于您的项目结构,您可以运行
gita add -r <root>
这会自动将下级存储库添加到一个组中。
然后
gita ll root
会显示相关信息。 gita <command> root
将在根组中的存储库上批量运行该命令。您当然也可以从任何工作目录在指定的存储库上运行命令。
还有其他功能,例如设置上下文、定义自定义命令等。安装是
pip3 install -U gita
。您可以在github上找到更多信息。
gita ll
命令在分支名称旁边显示 3 个可能的符号,表示
+
:阶段性变化*
:未分阶段的更改_
:未跟踪的文件/文件夹分支名称有 5 种颜色
颜色 | 意义 |
---|---|
白色 | 本地没有远程 |
绿色 | 本地与远程相同 |
红色 | 本地与远程不同 |
紫色 | 本地领先于远程(有利于推送) |
黄色 | 本地位于远程后面(有利于合并) |
也许https://metacpan.org/module/rgit可能有帮助:)
将此别名添加到您的
.gitconfig
文件中,然后您可以从父目录运行 git status-all
以递归方式获取所有 git 存储库的状态。
[alias]
status-all = "!for d in `find . -name \".git\"`; do echo \"\n*** Repository: $d ***\" && git --git-dir=$d --work-tree=$d/.. status; done"
我不认为 git 有这个内置功能,因此前段时间我创建了一个脚本来执行此操作:https://github.com/mnagel/clustergit
clustergit
允许您同时在多个存储库上运行 git 命令。在一个文件夹上递归运行 git status 尤其有用。 clustergit
支持 git status
、git pull
、git push
等。
如果有人需要单衬:
rootdir=$(pwd);for folder in $(ls -p | grep /);do cd "$rootdir/$folder";git status; cd $rootdir; done
当我使用多个可编辑的研究存储库运行一些机器学习实验时,我也有同样的担忧。我发现有时由于存储库的更新,重现旧实验非常困难且耗时。
所以我写了一个小工具 Git_Repos_Tracker 来跟踪版本并强制所有跟踪的存储库在我运行实验时保持干净,请参阅 。它可以检测运行实验时是否使用调试器。在这种情况下,它将容忍脏存储库(未暂存和未提交的更改)。
所以每次当我完成实验时,我都会将所有存储库的提交号存储在我的日志文件中。我可以轻松地与我的同事和学生分享这些数字,让他们轻松地重现我的实验。