Makinemde bulunan tüm git depolarını görebilmemin bir yolu var mı? Bunun için herhangi bir emir var mı?
Makinemde bulunan tüm git depolarını görebilmemin bir yolu var mı? Bunun için herhangi bir emir var mı?
Yanıtlar:
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 .
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
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.
* Nix'te, bu aynı zamanda herhangi bir --baredepoyu da bulacaktır .
find / -name "*.git" -type d
name.git, örneğin benim takip etmediğim bir kural olarak adlandırılmasına gerek yoktur.
finddüşünülürse , bu depoların evrensel bir yolu var mı?
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
)
Linux'ta daha hızlı bir yol şu şekilde olacaktır:
locate -r "\.git$"
locate'in veritabanını güncel tuttuğunuzu varsayarak sudo updatedb
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 eklenmezLinux'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 ...
findşeyin çıktısını alıp sonra filtrelemenin bir anlamı yoktur grep. --name "*.git"
/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.
Basit bir PowerShell sürümü:
Get-ChildItem . -Recurse -Hidden .git
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
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