Git - 如何查找目录中所有项目的所有"未删除"提交?

Die*_*ego 9 git bash

我终于习惯了Git,在最初的陡峭学习曲线之后,我必须说它非常好(我只是想念单个文件的外部,但这是另一个故事).但是,我有一个我无法解决的问题:我目前正在同时处理十几个项目.它们都是相互关联的,我必须从一个跳到另一个,在这里和那里做出改变.

到目前为止一切都很好,我可以很容易地"耍弄"它们,我会定期更改等等.问题是,几个小时后,我不记得我推送到远程存储库的项目.当然,我可以"cd"到每个项目的目录并发出push命令,但这很乏味.我想知道是否有一种方法,使用bash,运行类似的东西git find all unpushed commits in all projects in this directory.这样的命令将从不是 Git存储库的目录运行,但包含所有项目的树.

逻辑很简单,但实现看起来相当复杂,因为尽管根目录包含所有项目,但实际的Git存储库可以从起始目录的任何级别找到.例如:

  • 项目目录
    • 客户X.
    • project1(Git repo)
    • 顾客你
    • project2(Git repo)
    • 项目3
      • somelibrary(Git repo)
      • 主题(Git回购)

在此示例中,只有粗体的目录是Git存储库,因此应在其中运行检查.我知道结构看起来有点乱,但它实际上很容易处理.

欢迎任何帮助,谢谢.

JKi*_*rtz 8

您可以找到未提交的提交git cherry,因此您应该能够编写类似的bash脚本

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    cd $file
    git cherry -v
    cd -
done
Run Code Online (Sandbox Code Playgroud)

它会找到3层子目录,但看起来可能并不是很好.

编辑

正如Evan建议你可以使用子shell来避免cd回复目录,就像这样

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    (cd $file && git cherry -v)
done
Run Code Online (Sandbox Code Playgroud)

你可能想pwd在这里放一个命令来查看你所在的文件/目录......

  • 您可以不使用 `cd -` 切换到上一个目录,而只需将循环体设为子 shell。 (2认同)

Qet*_*esh 6

您可以使用以下一行代码,根据您的要求,您可以使用它从非 Git 存储库的目录中进行搜索。这将列出具有未推送提交的 git 存储库的绝对路径:

find . -type d -iname '.git' -exec sh -c 'cd "${0}/../" && git status | grep -q "is ahead of" && pwd' "{}" \;
Run Code Online (Sandbox Code Playgroud)

这是通过递归搜索 .git 目录来实现的,当找到时 cd 到父目录,即 git 项目根目录。然后运行 ​​git status 和 grep 查找“is advance of”短语。如果这是 true,则执行 && 之后的命令,在本例中为“pwd”命令。您可以在此处插入自己的命令(例如显示未推送的提交)。

注意:仅适用于活动分支上未推送的提交


mna*_*gel 6

你可以看一下git子模块,但我个人觉得它们使用起来并不愉快.前一段时间我创建了一个脚本来处理git repos的集合:https://github.com/mnagel/clustergit

clustergit允许您一次在多个存储库上运行git命令.在一个文件夹上递归运行git status特别有用.clustergit支持git status,git pull,git push,等等.

在此输入图像描述


Ada*_*ruk 5

使顶层成为git repo并使每个项目成为子模块.现在你可以跑了

git submodule foreach --recursive git status # or any other command
Run Code Online (Sandbox Code Playgroud)

如果项目中没有任何子模块,则不需要递归.