有没有一种方法可以查看我机器上存在的所有git仓库?有没有相应的命令?
有没有一种方法可以查看我机器上存在的所有git仓库?有没有相应的命令?
如果您使用Linux,请执行find / -name ".git"
命令进行查找,否则只能使用您的操作系统文件/文件夹查找程序来查找以.git
命名的文件夹,因为这些是标准目录。
for d in \
find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done`。它的作用是在当前机器的根目录下查找所有名为 ".git" 的文件夹,并进入每个文件夹的上级目录,输出该目录的路径和 git 仓库的状态信息。 - LJ VanKuikenGet-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 }
FINAL NOTE: 以上解决方案仅返回当前目录下的Git代码库。如果要获取驱动器上的所有代码库,则应在每个驱动器的根目录下运行一次该命令。Get-ChildItem . -Attributes Directory,Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse | Out-File -FilePath C:\Dev\GitRepoList.txt
- Keith E. Truesdell在*nix系统上,这也将找到任何--bare
仓库。
find / -name "*.git" -type d
name.git
,那只是一种约定。例如,我就没有遵循这个约定。 - Arkaitz JimenezGit仓库都包含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
命令是)
git init newrepo
是最少步骤来初始化一个Git版本库的命令。mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
=>)
.git
的存储库),当find
的根目录为/
时:find / -name .git -exec dirname {} \; -prune
但对于主要存储库位于根目录下的情况,以下方法可能是最快的(您可以将 /
替换为 .
或其他根目录):
find / -type d -exec test -d {}/.git \; -prune -print
对于find
命令中使用的primaries的快速解释(由于此处没有operators,因此-and
是隐含的,即对于每个访问的节点,primaries从左到右进行评估,直到其中一个评估结果为false
):
-name
:如果名称匹配,则为true
(通常使用通配符,但不在这里)-exec
:执行以;
终止的命令(该分号可以通过\
进行转义,以避免被Shell解释),如果返回状态为0
(即OK),则为true
。当前节点可用作{}
(无需转义)-prune
:始终为true
,并导致跳过所有子节点-type d
:对于目录为true
-print
:在这里需要,因为如果存在-exec
,它不会隐式追加\;
替换为+
,以便不会为每个存储库启动一个dirname
进程。
你说得对,在这种情况下,我说它快得多是错误的。每当我看到一个find命令没有利用接受文件列表作为参数的命令时,我就会有一种恐怖的反应。 - Johan Boulélocate -r "\.git$"
,假定您使用sudo updatedb
来更新locate数据库。Get-ChildItem . -Recurse -Hidden .git
C:\ users \<username> \ PrintHood
)。此外,我发现将输出添加到文件中很有用,由于我只关心路径(因为此脚本获取了大量信息),所以还要仅过滤路径/目录信息。Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
- Keith E. Truesdellfind / | grep \\.git$
这只是搜索以 .git 结尾的所有文件...你可以使用 Windows、Linux 等搜索工具来完成。
find
输出所有内容再用grep
筛选,我更倾向于使用--name "*.git"
。 - Gregory Pakosz/
树传输给第二个进程的grep。但第一个进程可以完成所有操作,并避免了巨大而无用的IO使用。对于用户通常没有真正的区别,但对于大型文件系统可能会有所不同。 - Arkaitz Jimenez与Eric Burcham的回答略有不同,该回答没有在结尾添加“\.git”。
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }
我在每天开始时使用此命令。它简单地添加了一些 git 命令到上面的命令中。由于某种原因,我们的 git 仓库最好先运行 fetch 然后再 pull ,不知道为什么。而且出于某种原因,我们有很多子模块。无论如何,在 {} 中放置所需内容。
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
对于 Linux:
dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo