如何查看机器上的所有 git 存储库?

有没有一种方法可以让我看到我机器上存在的所有 git 存储库?有命令吗?

138718 次浏览

如果你在 Linux find / -name ".git"中,否则没有办法,它们都是标准目录,只能用你的 OS 文件/文件夹查找程序来查找 .git命名的文件夹。

在 * nix 上,这也可以找到任何 --bare存储库。

find / -name "*.git" -type d

在 Linux 上,使用 root 权限尝试以下命令:

find / | grep \\.git$

这只是搜索每个文件的结尾。Git... 你可以用 Windows,Linux 等搜索工具来做..。.

原答案 : 从 Windows PowerShell 来看,这种方法非常有效:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse

编辑 # 1 :-过滤器是 两倍的速度作为-包含。以下是解决方案:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse

编辑 # 2 : Keith E. Truesdell提到将输出发送到一个文件。请参阅他对该解决方案的评论。我更喜欢控制台输出。但他的评论让我想到,我更喜欢完整的路径,而不是默认返回的整个混乱。如果只需要完整路径,请使用以下命令:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }

最后注意 : 以上解决方案 只在工作目录下返回 Git 存储库。如果希望在一个驱动器上运行所有存储库,则应该从每个驱动器的根运行该命令一次。

在 Linux 上,一种更快捷的方式是:

locate -r "\.git$"

假设你用 sudo updatedb更新定位的数据库

Git 存储库都有 HEADrefsobjects条目。

在 GNU/anything 上,

find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n

只是检查 .git将错过许多裸回购和子模块。

要完全偏执地进行检查,您可以要求 git 在打印之前完成所有自己的检查,

find -name HEAD -execdir test -e refs -a -e objects \; \
-execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;

(编辑: 我认为 .git/config文件是必要的,结果它不是,所以绝对最小 git init newrepo

mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD

)

在 Linux 和 OS X 上,当 find的根目录是 /时,以下命令可能是最快的(忽略没有 .git的存储库) :

find / -name .git -exec dirname {} \; -prune

但是对于底层大部分都有存储库的根,下面的代码可能是最快的(您可能希望用 .或其他根代替 /) :

find / -type d -exec test -d {}/.git \; -prune -print

快速解释使用的 find初选(因为这里没有 操作员,所以 -and是隐式的,即对于每个访问的节点 初选从左到右进行计算,直到其中一个计算为 false) :

  • 如果名称匹配(通常使用通配符,但这里不是) ,则 -nametrue
  • -exec执行一个由 ;终止的命令(\转义该命令以避免 shell 的解释) ,如果返回状态为 0(即 OK) ,则为 true。当前节点可以使用 {}(不需要转义)
  • -prune始终是 true,并导致跳过所有子节点
  • 目录的 -type dtrue
  • 这里需要 -print,因为如果 -exec存在,它不会隐式附加

对于 Linux:

dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo

简单的 PowerShell 版本:

Get-ChildItem . -Recurse -Hidden .git

与 Eric Burcham 的答案稍有不同。那个答案是加上。 git 到结尾,而这个不是。

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }

我在一天开始的时候使用这个命令。它只是向上面添加了一些 git 命令。由于某种原因,我们的 git 存储库在运行一个提取然后拉取时工作得最好,不知道为什么。由于某种原因,我们有很多子模块。无论如何,把你需要的放在{}之间。

push-location; Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { cd $_.parent.fullname; write-host '*************'; $(get-location).path; git fetch; git pull; git checkout .; git clean -f; git submodule update; git status; write-host '*************'; write-host ' '; }; pop-location