有没有一种方法可以查看我的计算机上存在的所有git存储库?有什么命令吗?
有没有一种方法可以查看我的计算机上存在的所有git存储库?有什么命令吗?
Answers:
如果您使用的是Linux find / -name ".git",则无法执行,它们是标准目录,只需使用OS文件/文件夹查找程序来查找.git命名文件夹。
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
原始答案:从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
编辑2: Keith E. Truesdell提到将输出发送到文件。有关该解决方案,请参阅他的评论。我更喜欢控制台输出。但是他的评论让我想到我只喜欢完整的路径,而不是默认返回的整个混乱。如果只想使用完整路径,请使用以下命令:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }
最后的提示:以上解决方案仅返回当前目录下的Git存储库。如果要将所有存储库放在驱动器上,则应从每个驱动器的根目录运行一次命令。
在* nix上,这还将找到任何--bare存储库。
find / -name "*.git" -type d
name.git多数民众赞成,仅是一种约定,例如,我不遵循。
find?
Git仓库都有HEAD,refs和objects条目。
在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
)
在Linux上,更快的方法是:
locate -r "\.git$"
假设您保持locate的数据库更新为 sudo updatedb
在Linux和OS X下面的命令可能是最快的(忽略不存储库.git)时的根目录find是/:
find / -name .git -exec dirname {} \; -prune
但是对于下面主要具有存储库的根,以下可能是最快的(您可能希望替换/为.或另一个根):
find / -type d -exec test -d {}/.git \; -prune -print
在快速的解释初选的find使用(因为没有运营商都存在这里,-and是隐含的,也就是说,对于每一个访问的节点初选是从左向右计算,直到其中一个计算结果为false):
-name是true如果名称匹配(通配符通常(但在此处不匹配))-exec执行一个终止于;(\为了避免被shell解释而转义的)命令,并且true返回状态为0(即,OK)。当前节点可用{}(不需要转义)-prune始终为true,并导致所有子节点被跳过-type d是true对目录-print这里需要,因为如果-exec存在的话,它不是隐式附加的在Linux上,请以root权限尝试以下命令:
find / | grep \\.git$
这只会搜索以.git结尾的每个文件...您可以使用Windows,Linux等中的搜索工具来完成...
find所有内容输出然后使用过滤是没有意义的grep。我宁愿使用--name "*.git"
/树,第二个进程传递给grep,此时第一个进程可以做所有事情并避免大量无用的IO使用。通常,对于用户而言,这并不是真正的差异,但是对于大型文件系统,这可能会有所不同。
一个简单的PowerShell版本:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood 另外,我发现将输出添加到文件很有用,并且由于我只关心路径(因为此脚本获取了大量信息),因此也仅过滤路径/目录信息 Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
与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