自分のマシンに存在するすべてのgitリポジトリを表示する方法はありますか?そのためのコマンドは?
自分のマシンに存在するすべてのgitリポジトリを表示する方法はありますか?そのためのコマンドは?
回答:
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の2倍の速度です。これがその解決策です:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse
編集#2: キースE.トゥルースデルは、ファイルへの出力の送信について言及しました。そのソリューションについての彼のコメントを参照してください。私はコンソール出力を好みます。しかし、彼のコメントから、デフォルトで返される混乱全体ではなく、完全なパスだけを好むと思いました。完全なパスだけが必要な場合は、以下を使用します。
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }
最後の注意:上記のソリューションは、現在のディレクトリの下のGitリポジトリのみを返します。ドライブ上のすべてのリポジトリが必要な場合は、各ドライブのルートからコマンドを1回実行する必要があります。
* 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
;
(\
シェルによる解釈を回避するためにエスケープされている)で終了するコマンドを実行しtrue
、戻りステータスが0
(つまりOK)の場合に実行します。現在のノードは次のように使用できます{}
(エスケープする必要はありません)-prune
は常にtrue
であり、すべての子ノードがスキップされます-type d
あるtrue
ディレクトリについて-print
-exec
存在する場合は暗黙的に追加されないため、ここで必要ですLinuxでは、root権限で次のコマンドを試してください。
find / | grep \\.git$
これは、.gitで終わるすべてのファイルを検索するだけです... Windows、Linuxなどの検索ツールで実行できます...
find
すべてを出力させてからでフィルタリングしても意味がありませんgrep
。私はむしろ使用したい--name "*.git"
/
ツリー全体に送信し、2番目のプロセスがgrepに送信されるようにします。通常のユーザーにとっては実際の違いではありませんが、大きなファイルシステムでは違いが生じる可能性があります。
単純なPowerShellバージョン:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood
また、それは便利にもパス/ディレクトリ情報のためにのみフィルタリングする(このスクリプトは情報の束を取得して)ファイルに、私はパスだけを気にするので、出力を追加しました。 Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
エリックバーチャムの答えからの小さな変化。その答えは最後に\ .gitを追加しますが、これはそうではありません。
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }
このコマンドは1日の始めに使用します。上記にいくつかの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