自分のマシン上のすべてのgitリポジトリを表示するにはどうすればよいですか?


121

自分のマシンに存在するすべてのgitリポジトリを表示する方法はありますか?そのためのコマンドは?


2
git-summaryを参照してください。これは、すべてのリポジトリを一覧表示し、それらのステータス情報を出力するbashスクリプトです。免責事項、私は開発者の一人です。
cagliari2005

@ cagliari2005:裸のリポジトリはどうですか?stackoverflow.com/questions/60064170/...
ルチアーノ

回答:


102

Linuxを使用している場合find / -name ".git"、それ以外の方法はありません。それらは標準のディレクトリです。OSファイル/フォルダー検索プログラムを使用して、.git名前付きフォルダーを検索します。


1
Windows(Macもきっと)でも同様のことができます... .gitという名前のディレクトリを検索するだけです-これはgitがメタ情報を保存するために使用するものです。
cjstehno 2010年

3
Macでは、上記のコマンドも機能します。(OS9以前を実行している場合を除きます)
Alex Feinman

1
この単純なファイル検索機能を実装し、リポジトリステータス情報をリストに追加する優れたシェルスクリプトまたは小さなユーティリティアプリケーションはありますか?そうするためにシェルスクリプトを書くことは問題ではありませんが、むしろ私自身の最適化されていないハックよりもよく採用されたスクリプトを使用してください。
jmlane

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

マニュアルページに解決策があります。受け入れられた回答に似ていますが、-pruneを使用して、.gitディレクトリに移動せずに高速に戻ります。pruneがなければ、findは.gitフォルダーに移動し、内容によっては不必要に内部を検索するのに時間を費やします。manページのソリューションは、「find repo /(-exec test -d '{}' /。svn \; -or \ -exec test -d {} /。git \; -or -exec test -d {} / CVS \ ;)\ -print -pruneチェックアウトしてください。必要でない場合はsvnとcvsを編集してください
quiet_penguin

38

元の回答:これは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回実行する必要があります。


1
Windowsユーザーにとって非常に便利です。:)
Felix Feliciant

2
Get-ChildItem:パラメーター名 'Attributes'に一致するパラメーターが見つかりません。行:1文字:28
Dewald Swanepoel 2017年

@DewaldSwanepoel-Attributesパラメータに関するエラーが表示される理由がわかりません。それは明らかにドキュメントにあり、私は今いくつかのWindows / PowerShellバージョンの組み合わせでそれを試しました。Windows 7、8、および10はすべて、PowerShellのさまざまなバージョンで動作します。エラーが発生している理由がわかった場合は、ここで共有してください。学習できます:>)
bopapa_1979

2
@DewaldSwanepoel-PowerShellバージョンを間違いなくアップグレードできます。チョコレートでやります。現在、Windows 7でPowerShellバージョン5.0を実行しています。
bopapa_1979 2017年

1
@ KeithE.Truesdell-「Directory + Hidden」属性が包括的で、ディレクトリのみを検索することを確信しています。-Directoryを追加すると、PowerShellの新しいバージョンで高速になります。時間をかけていきます。編集-「-Directory」を追加しても、ドキュメントに示されているように、実質的な違いはありません。ただし、提案どおりにディレクトリ属性を追加すると、処理が遅くなります。理由はわかったのですが、Measure-Commandを使用して両方の方法でテストしました。追加のDirectory属性を使用した3つすべてが、3つすべてを使用した場合よりも低速でした。
bopapa_1979

18

* nixでは、これにより--bareリポジトリも検索されます。

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

3
ベアリポジトリはname.git、命名規則である必要はありません。たとえば、私が従わない規則です。
Arkaitz Jimenez、2010

3
ベアリポジトリがその命名規則に従う必要がないことを考えると、findそれらのリポジトリへの普遍的な方法はありますか?
jmlane '10 / 06/11

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):

  • -nameあるtrue名前が(ワイルドカードで、ここでは多くの場合ではなく)と一致した場合
  • -exec;\シェルによる解釈を回避するためにエスケープされている)で終了するコマンドを実行しtrue、戻りステータスが0(つまりOK)の場合に実行します。現在のノードは次のように使用できます{}(エスケープする必要はありません)
  • -pruneは常にtrueであり、すべての子ノードがスキップされます
  • -type dあるtrueディレクトリについて
  • -print-exec存在する場合は暗黙的に追加されないため、ここで必要です

2

Linuxでは、root権限で次のコマンドを試してください。

find / | grep \\.git$

これは、.gitで終わるすべてのファイルを検索するだけです... Windows、Linuxなどの検索ツールで実行できます...


7
findすべてを出力させてからでフィルタリングしても意味がありませんgrep。私はむしろ使用したい--name "*.git"
グレゴリーパコス

2
@Gregory Pakosz:違いは何ですか?
Michel Gokan、2010年

11
@ Michel、2つのプロセスを開始し、最初のプロセスがパイプ全体を/ツリー全体に送信し、2番目のプロセスがgrepに送信されるようにします。通常のユーザーにとっては実際の違いではありませんが、大きなファイルシステムでは違いが生じる可能性があります。
Arkaitz Jimenez、2010

2
いずれにしても、JUST findコマンドを使用する場合は、-nameではなく-regexを使用することをお勧めします。この場合は、次のコマンドを使用します。sudo find / -regex '。* \。git'
Michel Gokan

4
@MichelKoganより良い理由は?
Mark Amery

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
キース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

エリックバーチャムの答えからの小さな変化。その答えは最後に\ .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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.