有没有一种方法可以让我看到我机器上存在的所有 git 存储库?有命令吗?
如果你在 Linux find / -name ".git"中,否则没有办法,它们都是标准目录,只能用你的 OS 文件/文件夹查找程序来查找 .git命名的文件夹。
find / -name ".git"
.git
在 * nix 上,这也可以找到任何 --bare存储库。
--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更新定位的数据库
sudo updatedb
Git 存储库都有 HEAD、 refs和 objects条目。
HEAD
refs
objects
在 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是
.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
/
find / -name .git -exec dirname {} \; -prune
但是对于底层大部分都有存储库的根,下面的代码可能是最快的(您可能希望用 .或其他根代替 /) :
.
find / -type d -exec test -d {}/.git \; -prune -print
快速解释使用的 find的 初选(因为这里没有 操作员,所以 -and是隐式的,即对于每个访问的节点 初选从左到右进行计算,直到其中一个计算为 false) :
-and
false
-name
true
-exec
;
\
0
{}
-prune
-type d
-print
对于 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