Git -如何找到目录中所有项目的所有“未推送”提交?

nbysray5  于 2023-11-15  发布在  Git
关注(0)|答案(8)|浏览(165)

我终于习惯了Git,在最初的陡峭学习曲线之后,我必须说它相当不错(我只是想念单个文件的外部,但那是另一个故事)。然而,我有一个问题无法解决:我目前同时在做十几个项目。它们都是相互关联的,我必须从一个跳到另一个,在这里和那里做修改。
到目前为止,一切都很好,我可以很容易地“玩弄”它们,我定期提交更改等等。问题是,几个小时后,我不记得我推到远程仓库的项目。当然,我可以“cd”到每个项目的目录并发出push命令,但这很繁琐。我想知道是否有一种方法,使用bash,运行类似 git find all unpushed commits in all projects in this directory 的命令。这样的命令将从一个目录运行,该目录不是Git仓库,但包含所有项目的树。
逻辑很简单,但实现起来却相当复杂,这也是因为,尽管根目录包含了所有的项目,但实际的Git仓库可以在起始目录的任何级别找到。例如:

  • projects目录
  • 客户X
    *project1(Git repo)
  • 用户U
    *project2(Git repo)
  • 项目3
    *somelihood(Git repo)
    *theme(Git repo)

在这个例子中,只有粗体的目录是Git仓库,因此检查应该在它们内部运行。我知道结构看起来有点混乱,但实际上很容易处理。
任何帮助都是受欢迎的,谢谢。

mnowg1ta

mnowg1ta1#

您可以使用git cherry查找未推送的提交,因此您应该能够编写一个bash脚本,如

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    cd $file
    git cherry -v
    cd -
done

字符串
它将找到3层子目录,但它可能不是很好看。

编辑

正如Evan建议的那样,您可以使用子shell来避免cd返回目录,如下所示

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


你可能想在这里放一个pwd命令,看看你在哪个文件/目录中。

yyhrrdl8

yyhrrdl82#

你可以看一下git子模块,但我个人并不觉得它们很好用。
clustergit允许您同时在多个仓库上运行git命令。在一个文件夹上递归运行git status特别有用。clustergit支持git statusgit pullgit push等。


的数据

mccptt67

mccptt673#

将顶层设置为git repo,并将每个项目设置为子模块。

git submodule foreach --recursive git status # or any other command

字符串
如果项目中没有任何子模块,则不需要递归。

wb1gzix0

wb1gzix04#

你可以使用下面的一行代码,根据你的要求,你可以使用它从一个不是Git仓库的目录中搜索。这将列出有未推送提交的git仓库的绝对路径:

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

字符串
这是通过递归搜索.git目录来实现的,当找到时,cd到父目录,即git项目的根目录。然后运行git status和grep以获取“is ahead of”短语。如果这是真的,则执行&&之后的命令,在本例中是'pwd'命令。在这里您可以插入自己的命令(例如显示未推送的提交)。
注意:仅适用于活动分支上未推送的提交

zlwx9yxi

zlwx9yxi5#

以下命令也支持带有空格的路径,并且只检查包含.git子目录的目录。

每个repo未推送的更改数(所有分支):

while IFS= read -r -d '' dir; 
    do 
        ([ -d "$dir/.git" ] && cd "$dir" && echo -n `pwd`\
        && echo " [ UNPUSHED: "`git log --branches --not --remotes | grep "^commit" | wc -l`" ]" ); 
    done < <(find -type d -print0)

字符串

每个repo的未提交文件数(暂存和未暂存):

while IFS= read -r -d '' dir; 
    do 
        ([ -d "$dir/.git" ] && cd "$dir" && echo -n `pwd`\
         && echo " [ UNCOMMITTED: "`git status -s | wc -l`" ]"); 
    done < <(find -type d -print0)


注意,如果未设置upstream(-u),则git cherry不起作用,而上面的git log则起作用。

ctehm74n

ctehm74n6#

将这个别名添加到.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"

字符串
这就是this post

niknxzdl

niknxzdl7#

以下是针对那些使用fish的人的答案。基于JKirchartz的答案进行了一些调整:

for file in (find . -type d -maxdepth 3)
  if test -d "$file/.git"
    fish -c "cd $file; and git cherry -v; and pwd"
  end
end

字符串

gcmastyq

gcmastyq8#

Maestro开发人员实用程序有一个同步功能,可以打印所有存储库的本地状态(存储、本地更改、本地提交),并执行git pull

# install
curl -fsSL https://maestro.eighty4.tech/install.sh | sh

# do a git sync on all repositories, walking subdirectories to a depth of 2
maestro git

字符串

相关问题