Makinemdeki tüm git depolarını nasıl görüntüleyebilirim?


Yanıtlar:


102

Linux'taysanız find / -name ".git", aksi takdirde mümkün değildir, bunlar standart dizinlerdir, .gitadlandırılmış klasörleri bulmak için işletim sistemi dosya / klasör bulma programınızı kullanın .


1
Windows'ta (ve eminim Mac'te de) benzer bir şey yapabilirsiniz ... sadece .git adlı dizinleri aramak - git'in meta bilgilerini depolamak için kullandığı şey budur.
cjstehno

3
Mac'lerde yukarıdaki komut da çalışır. (OS9 veya önceki bir sürümünü çalıştırmıyorsanız!)
Alex Feinman

1
Bu basit dosya arama işlevini uygulayan ve listeye depo durumu bilgilerini ekleyen iyi kabuk komut dosyaları veya küçük yardımcı program uygulamaları var mı? Bunu yapmak için bir kabuk komut dosyası yazmak bir sorun olmamalı, bunun yerine kendi optimize edilmemiş hacklerim yerine iyi uyarlanmış komut dosyaları kullanmak.
jmlane

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

man sayfasının çözümü var. Kabul edilen yanıta benzer ancak .git dizinlerine gitmeden daha hızlı dönmek için -prune kullanılır. Prune find olmadan .git klasörüne gider ve içeriğe bağlı olarak gereksiz yere arama zaman harcar. Man sayfası çözümü "repo bul / (-exec test -d '{}' /. Svn \; -veya \ -exec test -d {} /. Git \; -veya -exec test -d {} / CVS \ ;) \
-print -prune

38

ORİJİNAL CEVAP : Bu, Windows Powershell'den oldukça iyi çalışıyor:

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

DÜZENLEME # 1 : -Filter -Include'dan iki kat daha hızlıdır . İşte o çözüm:

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

DÜZENLEME 2 : Keith E. Truesdell , çıktının bir dosyaya gönderilmesinden bahsetti. Bu çözüm için yaptığı açıklamaya bakın. Konsol çıktısını tercih ederim. Ancak yorumu, varsayılan olarak döndürülen tüm karmaşayı değil, yalnızca tam yolu tercih ettiğimi düşündürdü. Bunun tam yol olmasını istiyorsanız, aşağıdakileri kullanın:

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

SON NOT : Yukarıdaki çözümler, yalnızca geçerli dizin altındaki Git depolarını döndürür . Bir sürücüde TÜM depoları istiyorsanız, komutu her sürücünün kökünden bir kez çalıştırmalısınız.


1
Windows kullanıcıları için çok kullanışlı! :)
Felix Feliciant

2
Get-ChildItem: 'Attributes' parametre adıyla eşleşen bir parametre bulunamıyor. Satırda: 1 karakter: 28
Dewald Swanepoel

@DewaldSwanepoel - Öznitelikler parametresiyle ilgili bu hatayı neden gördüğünüz hakkında hiçbir fikrim yok. Açıkça belgelerde var ve şimdi birkaç Windows / PowerShell sürüm kombinasyonunda denedim. Windows 7, 8 ve 10, benim için çeşitli PowerShell sürümleriyle çalışır. Hatanın neden oluştuğunu
ÖĞRENİYORSANIZ

2
@DewaldSwanepoel - PowerShell sürümünüzü KESİNLİKLE yükseltebilirsiniz. Bunu çikolatayla yapıyoruz. Şu anda iş yerinde Windows 7 üzerinde PowerShell 5.0 sürümünü çalıştırıyorum.
bopapa_1979

1
@ KeithE.Truesdell - "Dizin + Gizli" özniteliklerinin kapsayıcı olduğundan oldukça eminim ve yalnızca dizinleri arayacak. PowerShell'in yeni sürümlerinde -Directory ekleniyor. Ben zamana gideceğim. DÜZENLE - "-Directory" eklemek, dokümantasyonun da göstereceği gibi önemli bir fark yaratmaz. Bununla birlikte, önerdiğiniz gibi Dizin Özniteliğini eklemek onu yavaşlatır. Nedenini şimdi bir fikrim var, ancak bunu Measure-Command ile her iki şekilde de test ettim ve ek Directory özniteliğine sahip üçü de olmayan üçünden daha yavaştı.
bopapa_1979

18

* Nix'te, bu aynı zamanda herhangi bir --baredepoyu da bulacaktır .

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

3
Çıplak depoların name.git, örneğin benim takip etmediğim bir kural olarak adlandırılmasına gerek yoktur.
Arkaitz Jimenez

3
Çıplak depoların bu adlandırma kuralına uymasına gerek olmadığı finddüşünülürse , bu depoların evrensel bir yolu var mı?
jmlane

11

Git depoları hepsine sahip HEAD, refsve objectsgirişleri.

GNU / herhangi bir şey üzerinde,

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

Sadece kontrol etmek, .gitbirçok çıplak depo ve alt modülü kaçıracaktır.

Kontrolde tam paranoyaklaşmak için git'e yazdırmadan önce kendi kontrollerini yapmasını isteyebilirsiniz,

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

(düzenleme: düşündüğümden .git/configmutlak minimum böylece, bunun dışında dönüşler değil, dosya gerekliydi git init newrepoolduğunu

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

)



3

Linux ve OS X'te aşağıdaki komutu muhtemelen en hızlı (olmadan depoları görmezden .gitkök dizin olduğunda) findise /:

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

Ancak, altında çoğunlukla depo bulunan kökler için aşağıdakiler muhtemelen en hızlısıdır ( veya başka bir kök /ile değiştirmek isteyebilirsiniz .):

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

Hızlı açıklama Primer arasında find(herhangi bir yana kullanılan operatörler burada mevcut olan -andher ziyaret düğüm için, diğer bir deyişle kapalı olan primerler bunlardan biri değerlendirir kadar soldan sağa olarak incelenmiştir false):

  • -nameolan trueadı (wildcard ile, burada olmasa da çoğunlukla) eşleşirse
  • -exectarafından sonlandırılan bir komutu yürütür ;( \kabuk tarafından yorumlanmasını önlemek için öncelenir ) ve truedönüş durumu ise 0(yani, Tamam). Geçerli düğüm şu şekilde kullanılabilir {}(kaçış gerektirmez)
  • -pruneher zaman trueve tüm alt düğümlerin atlanmasına neden olur
  • -type dolduğu truedizinlerinin
  • -printburada gereklidir, çünkü mevcutsa -exec, örtük olarak eklenmez

2

Linux'ta, bu komutu root izniyle deneyin:

find / | grep \\.git$

bu sadece .git ile biten her dosyayı arar ... bunu Windows, Linux vb. araçlarda arama araçlarıyla yapabilirsiniz ...


7
Her findşeyin çıktısını alıp sonra filtrelemenin bir anlamı yoktur grep. --name "*.git"
Kullanmayı

2
@Gregory Pakosz: Fark nedir?
Michel Gokan

11
@Michel, 2 işlemi /başlatırsın ve ilki her şeyi yapabildiğinde ve devasa gereksiz IO kullanımından kaçındığında, birincisinin tüm ağacı bir borudan geçirmesini sağlıyorsun, ikincisi grep. Normalde kullanıcı için gerçek bir fark değildir, ancak büyük dosya sistemleri için bir fark yaratabilir.
Arkaitz Jimenez

2
herhangi bir şekilde, JUST find komutunu kullanmak istiyorsanız, -name yerine -regex kullanmak daha iyidir ... bu durumda şu komutu kullanın: sudo find / -regex '. * \. git'
Michel Gokan

4
@MichelKogan daha iyi neden?
Mark Amery

2

Basit bir PowerShell sürümü:

Get-ChildItem . -Recurse -Hidden .git

1
Bu benim için çalıştı! Teşekkür ederim! Normal bir kullanıcı olarak çalışan powershell betiğinin erişemediği erişmeye çalıştığı birkaç konum için bazı hatalar aldım, ancak daha fazla incelemeden sonra bunlar zaten endişelenmemem gereken yerlerdi (yani - C:\users\<username>\PrintHood Ayrıca, ben bir dosyaya bir çıktı eklemeyi yararlı buldum ve yalnızca yol / dizin bilgisini de filtrelemek için (bu komut dosyası bir sürü bilgi aldığından) yalnızca yolu önemsediğimden. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell

1

Linux için:

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

1

Eric Burcham'ın cevabından küçük bir varyasyon. Bu yanıt sona \ .git ekler, bu değil.

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

Bu komutu günün başında kullanıyorum. Yukarıdakilere basitçe birkaç git komutu ekler. Nedense, git depomuz en iyi şekilde biri bir getirme çalıştırıp sonra çekerse çalışır, nedenini bilmiyorum. Ve bazı nedenlerden dolayı birçok alt modülümüz var. Her neyse, ihtiyacınız olan şeyi {} arasına yazın.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.