有没有办法在终端列出git存储库?

stu*_*awk 12 git terminal

我的系统上有几个git存储库,我想在终端列出所有这些存储库.

我正在寻找的是这样的:

/ path/to/my/git/repo/1/REPONAME1
/ path/to/my/git/repo/2/REPONAME2
/ path/to/my/git/repo/3/REPONAME3

如果你能想出如何显示分支名称和回购的状态,例如.[大师] c:0你:1 d:0,那会很棒.

小智 9

要列出系统上的所有git存储库,可以在bash shell终端(在命令行中)运行以下命令并找到它们.

find / -name .git -type d -exec dirname {} \;
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现这比find命令更准确,速度更快.我相信它可以改进,但这是一个好的开始.显然,在运行此命令之前,您的文件数据库需要是最新的.在Linux系统上,您可以通过运行' updatedb' 来完成此操作.

locate -br '\.git$' | rev | cut -c 6- | rev
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 5

\n

如果您能想出如何显示分支名称和存储库的状态

\n
\n

这个想法是:

\n\n

首先,选择您想要的任何配置键名称。
\n例如:“ list.repos

\n

git config --unset-all使用(在全局配置文件中)重新初始化列表:

\n
git config --global --unset-all list.repos\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用:

\n\n

将结果重定向到文件“list-repos.txt”中,然后注册这些存储库,读取文件的每一行

\n
git config --global --unset-all list.repos\n
Run Code Online (Sandbox Code Playgroud)\n

一旦你的存储库被注册(作为全局 git 配置值),使用 new 命令循环它们git for-each-repo,执行你需要的任何命令就很简单了。

\n

Git 2.30(2020 年第 4 季度)引入了一个新命令,最初是为了管理“ git maintenanceman的部分内容并简化为其编写 crontab 条目(以及其他调度系统配置)。

\n

参见提交0016B61提交61F7A38提交A4CB1A2(2020年10月15日),提交2FEC604提交0C18B70COMPL 4950B2A ,提交B08FF1F(2020年9月11日)和COMMINC 1942d48(28 Aug 8月28日)(2020年8月28日)(由Derrick Stolee(Derrick Stolee)(derrickstolee))
\n (由Junio C Hamano 合并 -- gitster--提交 7660da1中,2020 年 11 月 18 日)

\n
\n

for-each-repo:在配置的存储库上运行子命令

\n

签署人:Derrick Stolee

\n
\n
\n

在全局或系统配置中存储存储库列表,然后在该列表上迭代 Git 命令会很有帮助。
\n创建一个新的内置函数,使专家的过程变得简单。
\n我们将在将来的更改中使用此内置函数对所有配置的存储库运行计划维护。

\n

该测试非常简单,但确实强调了“ --”参数是可选的。

\n
\n

git for-each-repo现在包含在其手册页中:

\n
\n

git-for-each-repo(1)

\n

姓名

\n

git-for-each-repo- 在存储库列表上运行 Git 命令

\n

概要

\n
[verse]\n\'git for-each-repo\' --config=<config> [--] <arguments>\n
Run Code Online (Sandbox Code Playgroud)\n

描述

\n

对存储库列表运行 Git 命令。已知选项或--指示符后面的参数用作 Git 子进程的参数。

\n

该命令是实验性的。行为可能会改变。

\n

例如,我们可以maintenance.repo使用以下命令对存储在配置变量中的每个存储库列表\n运行维护

\n
\n

git for-each-repo --config=maintenance.repo 维护运行

\n

这将为多值配置变量中的git -C <repo> maintenance run每个值运行。<repo>maintenance.repo

\n

选项

\n

--config=<config>

\n

使用给定的配置变量作为存储\n绝对路径名的多值列表。迭代该路径列表以运行\n给定的参数。

\n

这些配置值是从可用的系统、全局和本地 Git 配置中加载的。如果git for-each-repo在不是 Git 存储库的目录中运行,则仅使用系统和全局配置。

\n

子流程行为

\n

如果任何子git -C <repo> <arguments>进程返回非零退出代码,则git for-each-repo进程返回该退出代码而不运行更多子进程。

\n

每个git -C <repo> <arguments>子进程都继承标准文件\n描述符stdinstdoutstderr

\n
\n
\n

在 Git 2.30.1(2021 年第 1 季度)中,当配置变量未定义一次时,“ git for-each-repo --config=<var> <cmd>( man )不应为任何存储库运行。<cmd><var>

\n

请参阅Derrick Stolee ( )的提交 6c62f01(2021 年 1 月 8 日)。\n (由Junio C Hamano 合并 -- --提交 aa08688,2021 年 1 月 15 日)derrickstolee
gitster

\n
\n

for-each-repo:对空配置不执行任何操作

\n

报告人:Andreas B\xc3\xbchmann
\n帮助人:Eric Sunshine
\n帮助人:Junio C Hamano
\n签署人:Derrick Stolee

\n
\n
\n

当配置键 \' \' 没有值时, \' git for-each-repo --config=X\' ( man )应该返回成功而不调用任何子命令。\n当前的实现改为段错误。X

\n

如果用户使用 \' git maintenance start\' ( man )来初始化其 cron 计划,然后使用 \' \' ( man )删除配置git for-each-repo --config=maintenance.repo ...选项可能会遇到此问题。\n(注意:\' \' ( man )将删除配置删除 cron 计划。)git maintenance unregister
git maintenance stop

\n

添加一个简单的测试以确保其有效。
\n使用 \' git help --no-such-option\' ( man )作为潜在的子命令,以确保在运行该子命令时我们会遇到失败。

\n
\n
\n

注意:在 Git 2.39(2022 年第 4 季度)中,\' git for-each-repo\' ( man )被教导扩展路径中的波浪号字符。

\n

请参阅Taylor Blau ( )的提交 03744bb(2022 年 11 月 15 日)。\n请参阅 \xc3\x86var Arnfj\xc3\xb6r\xc3\xb0 Bjarmason ( )的提交 be0fd57(2022 年 11 月 15 日)。\n请参阅Ronan Pigott ( )的提交 1f80129提交 13d5bbd(2022 年 11 月 9 日)。\n (由Junio C Hamano 合并 -- --提交 56a64fc中,2022 年 11 月 23 日)ttaylorr
avar
RPigott
gitster

\n
\n

for-each-repo:插入存储库路径参数

\n

签字人:Ronan Pigott
\n签字人:Taylor Blau

\n
\n
\n

这是生活质量的改变git-maintenance,因此可以使用波形符语法来记录存储库。
\n默认情况下,register 子命令不会以这种格式记录存储库。

\n
\n
\n

使用 Git 2.41(2023 年第 2 季度),git for-each-repo更加强大:

\n

请参阅提交 3611f74提交 9e2d884提交 1c7e239提交 f7b2ff9提交 a428619提交 f6f348a提交 b83efce提交 e7587a8提交 258902c(2023 年 3 月 28 日),作者:\xc3\x86var Arnfj\xc3\xb6r\ xc3\xb0 比贾梅森 ( avar)
\n (由Junio C Hamano 合并 -- gitster--提交 87daf40,2023 年 4 月 6 日)

\n
\n

for-each-repo:如果配置错误,请不要将其混为一谈

\n

签署人:\xc3\x86var Arnfj\xc3\xb6r\xc3\xb0 Bjarmason

\n
\n
\n

修复4950b2a中的逻辑错误(“ for-each-repo:在配置的存储库上运行子命令”,2020-09-11,Git v2.30.0-rc0 -批量 #6中列出的合并)。\n由于假设从调用返回的元素不会是“ ”,因此我们在运行命令时会将参数列表的和部分混为一谈。
repo_config_get_value_multi()NULL<path><command>

\n

正如前面的提交中所指出的,修复是转向更安全的API*_string_multi()版本*_multi()
\n此更改与其余更改分开,因为这些更改都出现了段错误。
\n在这次更改中,我们最终得到了不同的行为。

\n

当使用“ --config=<config>”形式时,我们将列表中的每个元素作为存储库的路径。
\n例如
\n配置如下:

\n
[repo] list = /some/repo\n
Run Code Online (Sandbox Code Playgroud)\n

我们会用这个命令:

\n
git for-each-repo --config=repo.list status builtin\n
Run Code Online (Sandbox Code Playgroud)\n

在 /some/repo 中运行“ git statusman,如下所示:

\n
git -C /some/repo status builtin\n
Run Code Online (Sandbox Code Playgroud)\n


\nsk " status" 来报告 " builtin" 目录。
\n但是,由于这样的配置将导致“ struct string_list *”具有一个元素,其“ string”成员是“ NULL”:

\n
[repo] list\n
Run Code Online (Sandbox Code Playgroud)\n

当我们在“”中构建命令行时,我们会builtin/for-each-repo.c...

\n
strvec_pushl(&child.args, "-C", path, NULL);\nfor (i = 0; i < argc; i++)\n  strvec_push(&child.args, argv[i]);\n
Run Code Online (Sandbox Code Playgroud)\n

...让“ path”成为“ NULL”,strvec_pushl()当它看到NULL我们将以第一个“ argv”元素作为“ -C”选项的参数结束时停止,例如:

\n
git -C status builtin\n
Run Code Online (Sandbox Code Playgroud)\n

即\n我们将在“ ”目录中
运行命令“ ” 。builtinstatus

\n

在另一种情况下,这可能是一个有趣的安全漏洞,但我认为这在这方面无异于小菜一碟。

\n

假设的攻击者需要能够编写配置供受害者运行,如果他们能够做到这一点,就会有更有趣的攻击向量。\n请参阅8d1a744
中添加的“safe.directory”设施(“ :create ”,2022-07-14,Git v2.38.0-rc0 -合并在第 6 批批次中列出)。setup.csafe.bareRepository

\n

更不可能的可能性是攻击者能够生成用于“ for-each-repo --config=<key>”的配置,但没有其他任何东西(例如,生成该列表的自动化系统)。

\n

即使在这种情况下,攻击向量也仅限于运行名称与攻击者感兴趣的目录(例如log存储库中的“”目录)相匹配的命令的用户。
\n命令的第二个参数(如果有的话)可能会让 git 死掉而不做任何有趣的事情(例如“ -p”到“ log”,没有“-p ”内置命令可以运行)。

\n
\n

  • @jthill 同意。这个答案“不是”单行的方法。这是为了说明新命令。 (2认同)