Lihat git-summary . Ini adalah skrip bash yang mencantumkan semua repositori dan mengeluarkan informasi statusnya. Disclaimer, saya adalah salah satu dev.
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.
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:
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:
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.
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 .
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
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'
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
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 {}.
Jawaban:
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.git
folder bernama.sumber
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
JAWABAN ASLI : Ini bekerja cukup baik dari Windows Powershell:
EDIT # 1 : -Filter dua kali lebih cepat dari -Include. Inilah solusinya:
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:
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.
sumber
Di * nix, ini juga akan menemukan
--bare
repositori apa pun .sumber
name.git
hanya konvensi, yang saya misalnya, jangan ikuti.find
repositori tersebut?Semua repositori Git memiliki
HEAD
,refs
danobjects
entri.di GNU / apapun,
Hanya memeriksa
.git
akan kehilangan banyak repo dan submodul kosong.Untuk menjadi paranoid penuh pada pemeriksaan, Anda dapat meminta git untuk melakukan semua pemeriksaannya sendiri sebelum mencetak,
(edit: Saya pikir
.git/config
file yang diperlukan, ternyata keluar itu tidak, jadi minimum absolutgit init newrepo
adalah)
sumber
Di Linux, cara yang lebih cepat adalah:
locate -r "\.git$"
dengan asumsi Anda terus memperbarui database lokasi
sudo updatedb
sumber
Di Linux dan OS X, perintah berikut mungkin yang tercepat (tanpa mengabaikan repositori
.git
) jika direktori rootfind
adalah/
:Tetapi untuk root yang sebagian besar memiliki repositori di bawahnya, berikut ini mungkin yang tercepat (Anda mungkin ingin mengganti
/
dengan.
atau root lain):Penjelasan singkat tentang pendahuluan yang
find
digunakan (karena tidak ada operator di sini,-and
bersifat implisit, yaitu, untuk setiap simpul yang dikunjungi, pendahuluan dievaluasi dari kiri ke kanan sampai salah satu dari mereka mengevaluasi kefalse
):-name
adalahtrue
jika namanya cocok (sering kali, tetapi tidak di sini, dengan karakter pengganti)-exec
mengeksekusi perintah yang diakhiri oleh;
(yang di-escape oleh\
untuk menghindari interpretasi oleh shell), dantrue
jika status kembaliannya adalah0
(mis., OK). Node saat ini tersedia sebagai{}
(yang tidak memerlukan pelolosan)-prune
selalutrue
, dan menyebabkan semua node turunan dilewati-type d
adalahtrue
untuk direktori-print
diperlukan di sini karena jika-exec
ada, itu tidak ditambahkan secara implisitsumber
Di Linux, coba perintah ini dengan izin root:
ini hanya mencari setiap file yang diakhiri dengan .git ... Anda dapat melakukannya dengan alat pencarian di Windows, Linux, dll ...
sumber
find
keluaran semuanya kemudian difiltergrep
. Saya lebih suka menggunakan--name "*.git"
/
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.Versi PowerShell sederhana:
sumber
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
Untuk Linux:
sumber
Variasi kecil dari jawaban Eric Burcham. Jawaban itu menambahkan \ .git untuk mengakhiri, yang ini tidak.
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 {}.
sumber