Bagaimana cara melihat semua repositori git di komputer saya?

121

Adakah cara agar saya dapat melihat semua repositori git yang ada di komputer saya? Ada perintah untuk itu?

n1kh1lp
sumber
2
Lihat git-summary . Ini adalah skrip bash yang mencantumkan semua repositori dan mengeluarkan informasi statusnya. Disclaimer, saya adalah salah satu dev.
cagliari2005
@ cagliari2005: Bagaimana dengan repositori telanjang? stackoverflow.com/questions/60064170/…
Luciano

Jawaban:

102

Jika Anda menggunakan Linux find / -name ".git", jika tidak, tidak mungkin, itu adalah direktori standar, cukup gunakan program pencarian file / folder OS Anda untuk menemukan .gitfolder bernama.

Arkaitz Jimenez
sumber
1
Di Windows (dan saya yakin Mac juga) Anda dapat melakukan sesuatu yang serupa ... hanya mencari direktori bernama .git - yang digunakan git untuk menyimpan informasi meta-nya.
cjstehno
3
Di Mac, perintah di atas juga berfungsi. (Kecuali Anda menjalankan OS9 atau yang lebih lama!)
Alex Feinman
1
Adakah skrip shell yang bagus atau aplikasi utilitas kecil yang menerapkan fungsi pencarian file sederhana ini dan menambahkan informasi status repositori ke daftar? Seharusnya tidak menjadi masalah untuk menulis skrip shell untuk melakukannya, melainkan menggunakan skrip yang diadopsi dengan baik daripada peretasan saya yang tidak dioptimalkan.
jmlane
6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken
temukan halaman manual memiliki solusi. Mirip dengan jawaban yang diterima tetapi menggunakan -prune untuk kembali lebih cepat tanpa masuk ke direktori .git. Tanpa prune find akan masuk ke folder .git dan tergantung pada isinya menghabiskan waktu mencari di dalam yang tidak perlu. Solusi halaman manual mengikuti "temukan repo / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -or -exec test -d {} / CVS \ ;) \ -print -prune Periksalah. Edit svn dan cvs jika tidak diperlukan
quiet_penguin
38

JAWABAN ASLI : Ini bekerja cukup baik dari Windows Powershell:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse

EDIT # 1 : -Filter dua kali lebih cepat dari -Include. Inilah solusinya:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse

EDIT # 2 : Keith E. Truesdell menyebutkan mengirimkan output ke file. Lihat komentarnya untuk solusi itu. Saya lebih suka keluaran konsol. Tetapi komentarnya membuat saya berpikir bahwa saya lebih suka jalur lengkap saja, bukan seluruh kekacauan yang dikembalikan secara default. Jika Anda hanya menginginkan jalur lengkap, gunakan yang berikut ini:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }

CATATAN AKHIR : Solusi di atas hanya mengembalikan repositori Git di bawah direktori saat ini . Jika Anda ingin SEMUA repositori di drive, Anda harus menjalankan perintah sekali dari root setiap drive.

bopapa_1979
sumber
1
sangat berguna untuk pengguna windows! :)
Felix Feliciant
2
Get-ChildItem: Tidak ditemukan parameter yang cocok dengan nama parameter 'Attributes'. Di baris: 1 karakter: 28
Dewald Swanepoel
@DewaldSwanepoel - Saya tidak tahu mengapa Anda melihat kesalahan itu tentang parameter Attributes. Ini jelas dalam dokumentasi, dan saya telah mencobanya sekarang pada beberapa kombinasi versi Windows / PowerShell. Windows 7, 8, dan 10 semuanya berfungsi dengan berbagai versi PowerShell untuk saya. Jika Anda MENEMUKAN mengapa kesalahan terjadi, silakan bagikan di sini sehingga kita dapat belajar:>)
bopapa_1979
2
@DewaldSwanepoel - Anda PASTI dapat meningkatkan versi PowerShell Anda. Kami melakukannya dengan cokelat. Saat ini saya menjalankan PowerShell versi 5.0 di Windows 7 di tempat kerja.
bopapa_1979
1
@ KeithE.Truesdell - Saya cukup yakin atribut "Direktori + Tersembunyi" bersifat inklusif, dan hanya akan mencari direktori. Menambahkan -Directory my menjadi lebih cepat di versi PowerShell yang lebih baru. Aku akan mengatur waktunya. EDIT - Menambahkan "-Directory" tidak membuat perbedaan material, seperti yang ditunjukkan oleh dokumentasi. Namun, menambahkan Atribut Direktori seperti yang Anda sarankan membuatnya lebih lambat. Saya sekarang tahu mengapa, tetapi saya mengujinya dengan Measure-Command dan ketiganya dengan atribut Direktori tambahan lebih lambat daripada ketiganya tanpa.
bopapa_1979
18

Di * nix, ini juga akan menemukan --barerepositori apa pun .

find / -name "*.git" -type d
gahooa
sumber
3
Repositori telanjang tidak perlu dinamai itu name.githanya konvensi, yang saya misalnya, jangan ikuti.
Arkaitz Jimenez
3
Mengingat bahwa repositori telanjang tidak perlu mengikuti konvensi penamaan itu, apakah ada cara universal untuk findrepositori tersebut?
jmlane
11

Semua repositori Git memiliki HEAD, refsdan objectsentri.

di GNU / apapun,

find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n

Hanya memeriksa .gitakan kehilangan banyak repo dan submodul kosong.

Untuk menjadi paranoid penuh pada pemeriksaan, Anda dapat meminta git untuk melakukan semua pemeriksaannya sendiri sebelum mencetak,

find -name HEAD -execdir test -e refs -a -e objects \; \
      -execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;

(edit: Saya pikir .git/configfile yang diperlukan, ternyata keluar itu tidak, jadi minimum absolut git init newrepoadalah

mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD

)

jthill
sumber
4

Di Linux, cara yang lebih cepat adalah:

locate -r "\.git$"

dengan asumsi Anda terus memperbarui database lokasi sudo updatedb

Ernesto
sumber
Jelas, temukan lebih cepat, gunakan dengan hati-hati, lihat di sini: unix.stackexchange.com/questions/60205/…
AjayKumarBasuthkar
3

Di Linux dan OS X, perintah berikut mungkin yang tercepat (tanpa mengabaikan repositori .git) jika direktori root findadalah /:

find / -name .git -exec dirname {} \; -prune

Tetapi untuk root yang sebagian besar memiliki repositori di bawahnya, berikut ini mungkin yang tercepat (Anda mungkin ingin mengganti /dengan .atau root lain):

find / -type d -exec test -d {}/.git \; -prune -print

Penjelasan singkat tentang pendahuluan yangfind digunakan (karena tidak ada operator di sini, -andbersifat implisit, yaitu, untuk setiap simpul yang dikunjungi, pendahuluan dievaluasi dari kiri ke kanan sampai salah satu dari mereka mengevaluasi ke false):

  • -nameadalah truejika namanya cocok (sering kali, tetapi tidak di sini, dengan karakter pengganti)
  • -execmengeksekusi perintah yang diakhiri oleh ;(yang di-escape oleh \untuk menghindari interpretasi oleh shell), dan truejika status kembaliannya adalah0 (mis., OK). Node saat ini tersedia sebagai {}(yang tidak memerlukan pelolosan)
  • -prune selalu true , dan menyebabkan semua node turunan dilewati
  • -type d adalah true untuk direktori
  • -printdiperlukan di sini karena jika -execada, itu tidak ditambahkan secara implisit
Walter Tross
sumber
2

Di Linux, coba perintah ini dengan izin root:

find / | grep \\.git$

ini hanya mencari setiap file yang diakhiri dengan .git ... Anda dapat melakukannya dengan alat pencarian di Windows, Linux, dll ...

Michel Gokan
sumber
7
Tidak ada gunanya membiarkan findkeluaran semuanya kemudian difilter grep. Saya lebih suka menggunakan--name "*.git"
Gregory Pakosz
2
@ Gregory Pakosz: Apa bedanya?
Michel Gokan
11
@Michel, Anda memulai 2 proses dan membuat yang pertama mengirimkan melalui pipa seluruh /pohon untuk grep kedua, ketika yang pertama dapat melakukan segalanya dan menghindari penggunaan IO yang sangat tidak berguna. Bukan perbedaan nyata bagi pengguna biasanya, tetapi untuk sistem file besar mungkin membuat perbedaan.
Arkaitz Jimenez
2
Bagaimanapun, jika Anda ingin menggunakan perintah JUST find, lebih baik menggunakan -regex daripada -name ... dalam hal ini, gunakan perintah ini: sudo find / -regex '. * \. git'
Michel Gokan
4
@MichelKogan lebih baik mengapa?
Mark Amery
2

Versi PowerShell sederhana:

Get-ChildItem . -Recurse -Hidden .git
Julien Brdy
sumber
1
Ini berhasil untuk saya! Terima kasih! Saya memang mendapatkan beberapa kesalahan untuk beberapa lokasi yang mencoba mengakses yang berjalan sebagai pengguna normal skrip PowerShell tidak memiliki akses ke, tetapi setelah ditinjau lebih lanjut, ini adalah tempat yang tidak perlu saya khawatirkan (yaitu - C:\users\<username>\PrintHood Juga, saya merasa berguna untuk menambahkan output ke file dan karena saya hanya peduli tentang jalur (karena skrip ini mendapat banyak info) untuk juga memfilter hanya untuk info jalur / direktori. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell
1

Untuk Linux:

dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo 
Dalam hukum
sumber
1

Variasi kecil dari jawaban Eric Burcham. Jawaban itu menambahkan \ .git untuk mengakhiri, yang ini tidak.

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }

Saya menggunakan perintah ini di awal hari. Ini hanya menambahkan beberapa perintah git di atas. Untuk beberapa alasan, repositori git kita bekerja paling baik jika seseorang menjalankan ambil lalu tarik, tidak tahu kenapa. Dan kami memiliki banyak submodul karena beberapa alasan. Pokoknya, letakkan apa yang Anda butuhkan di antara {}.

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
Nama tampilan
sumber