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


Answers:


102

如果您使用的是Linux find / -name ".git",则无法执行,它们是标准目录,只需使用OS文件/文件夹查找程序来查找.git命名文件夹。


1
在Windows上(并且我肯定也可以在Mac上),您可以执行类似的操作……只是搜索名为.git的目录-git用来存储其元信息。
cjstehno 2010年

3
在Mac上,上述命令也适用。(除非您正在运行OS9或更早版本!)
Alex Feinman 2010年

1
是否有任何好的Shell脚本或小型实用程序应用程序实现了这种简单的文件搜索功能,并将存储库状态信息添加到列表中?编写Shell脚本这样做不是问题,而是使用经过广泛采用的脚本,而不是我自己未优化的技巧。
jmlane 2011年

6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken

查找手册页有解决方案。与接受的答案类似,但是使用-prune可以更快地返回,而无需进入.git目录。如果没有修剪,find会进入.git文件夹,并且视内容而定,花不必要的时间在内部进行搜索。手册页解决方案遵循“查找回购/(-exec test -d'{}'/。svn \; -or \ -exec test -d {} /。git \; -or -exec test -d {} / CVS \ ;)\ -print -prune

38

原始答案:从Windows Powershell可以很好地工作:

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

编辑#1:-Filter的速度是-Include的两倍。这是解决方案:

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

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

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

最后的提示:以上解决方案仅返回当前目录下的Git存储库。如果要将所有存储库放在驱动器上,则应从每个驱动器的根目录运行一次命令。


1
对于Windows用户非常有用!:)
Felix Feliciant

2
Get-ChildItem:找不到与参数名称“ Attributes”匹配的参数。在线:1字符:28
Dewald Swanepoel

@DewaldSwanepoel-我不知道为什么您会看到有关Attributes参数的错误。它显然在文档中,我现在已经在几种Windows / PowerShell版本组合中进行了尝试。Windows 7、8和10对我来说都可以使用各种版本的PowerShell。如果您确实发现错误发生的原因,请在此处分享,以便我们学习:>)
bopapa_1979

2
@DewaldSwanepoel-您可以最终升级PowerShell版本。我们用巧克力做。我目前正在Windows 7上运行PowerShell版本5.0。
bopapa_1979

1
@ KeithE.Truesdell-我很确定“ Directory + Hidden”属性是包含性的,并且只会搜索目录。在新版本的PowerShell中,添加-Directory可以更快。我去计时。编辑-如文档所示,添加“目录”没有实质性区别。但是,按照您的建议添加目录属性确实会使它变慢。我现在知道为什么,但是我用Measure-Command都用了这两种方法,并且所有三个带有附加Directory属性的速度都比没有这三个方法的速度慢。
bopapa_1979

18

在* nix上,这还将找到任何--bare存储库。

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

3
裸存储库不必命名为name.git多数民众赞成,仅是一种约定,例如,我不遵循。
Arkaitz Jimenez 2010年

3
鉴于裸存储库无需遵循该命名约定,是否有通用的存储库方式find
jmlane 2011年

11

Git仓库都有HEADrefsobjects条目。

在GNU /任何东西上,

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



3

在Linux和OS X下面的命令可能是最快的(忽略不存储库.git)时的根目录find/

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

但是对于下面主要具有存储库的根,以下可能是最快的(您可能希望替换/.或另一个根):

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

在快速的解释初选find使用(因为没有运营商都存在这里,-and是隐含的,也就是说,对于每一个访问的节点初选是从左向右计算,直到其中一个计算结果为false):

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

2

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

find / | grep \\.git$

这只会搜索以.git结尾的每个文件...您可以使用Windows,Linux等中的搜索工具来完成...


7
find所有内容输出然后使用过滤是没有意义的grep。我宁愿使用--name "*.git"
Gregory Pakosz,2010年

2
@Gregory Pakosz:有什么区别?
Michel Gokan 2010年

11
@Michel,您启动2个进程,并使第一个进程通过管道传输整个/树,第二个进程传递给grep,此时第一个进程可以做所有事情并避免大量无用的IO使用。通常,对于用户而言,这并不是真正的差异,但是对于大型文件系统,这可能会有所不同。
Arkaitz Jimenez 2010年

2
无论如何,如果你想只使用find命令,最好是改用-regex -name的......在这种情况下,使用这个命令:“ * \混帐”须藤查找/ -regex
米歇尔Gokan

4
@MichelKogan为什么更好?
Mark Amery 2014年

2

一个简单的PowerShell版本:

Get-ChildItem . -Recurse -Hidden .git

1
这对我有用!谢谢!我确实在尝试访问的几个位置上遇到了一些错误,这些错误以普通用户的身份运行,而Powershell脚本没有访问权限,但是经过进一步的检查,这些地方我还是不应该担心的(即- C:\users\<username>\PrintHood 另外,我发现将输出添加到文件很有用,并且由于我只关心路径(因为此脚本获取了大量信息),因此也仅过滤路径/目录信息 Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell

1

对于Linux:

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

1

与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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.