मैं अपनी मशीन पर सभी गिट रिपॉजिटरी कैसे देख सकता हूं?


121

क्या कोई ऐसा तरीका है जिसमें मैं अपने मशीन पर मौजूद सभी गिट रिपॉजिटरी देख सकता हूं? उसके लिए कोई आज्ञा?


2
गिट-सारांश देखें । यह एक बैश स्क्रिप्ट है जो दोनों सभी रिपॉजिटरी को सूचीबद्ध करती है और उनकी स्थिति की जानकारी को आउटपुट करती है। डिस्क्लेमर, मैं देवों में से एक हूं।
cagliari2005

@ cagliari2005: नंगे रिपोजिटरी के बारे में क्या? stackoverflow.com/questions/60064170/…
लूसियानो

जवाबों:


102

यदि आप लिनक्स में हैं find / -name ".git", अन्यथा कोई रास्ता नहीं है, वे मानक निर्देशिका हैं, बस अपने ओएस फ़ाइल / फ़ोल्डर का उपयोग करें प्रोग्राम का .gitनाम फ़ोल्डर खोजने के लिए ।


1
विंडोज पर (और मुझे यकीन है कि मैक भी) आप कुछ ऐसा ही कर सकते हैं ... सिर्फ .it नाम की निर्देशिका की खोज करें - जो कि git का उपयोग अपनी मेटा जानकारी को संग्रहीत करने के लिए करता है।
cjstehno

3
Mac पर, उपरोक्त कमांड भी काम करता है। (जब तक आप OS9 या इससे पहले नहीं चला रहे हों!)
एलेक्स फेनमैन

1
कोई भी अच्छी शेल स्क्रिप्ट या छोटी उपयोगिता वाले अनुप्रयोग जो इस सरल फ़ाइल खोज की कार्यक्षमता को लागू करते हैं और सूची में रिपोजिटरी स्थिति की जानकारी जोड़ते हैं? ऐसा करने के लिए एक शेल स्क्रिप्ट लिखने के लिए एक मुद्दा नहीं होना चाहिए, बल्कि अपने स्वयं के अनधिकृत हैक की तुलना में अच्छी तरह से अपनाया स्क्रिप्ट का उपयोग करें।
जमलें १०'११

6
@ जेमलानेfor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
एलजे वनकुइकेन

खोज मैन पेज समाधान है। स्वीकृत उत्तर के समान लेकिन। बिना prune खोजने के .it फ़ोल्डर में चले जाते हैं और सामग्री के आधार पर अनावश्यक रूप से अंदर खोज करने में समय व्यतीत करते हैं। मैन पेज सॉल्यूशन "रेपो / (-exec test -d '{{/' / svn \? -Or \ -exec test -d {} /। Git \; -or -ececec test -d {} / CVS \) को खोजता है। ;) \ -प्रिंट -प्र्यून इसे जांचें। यदि आवश्यक नहीं है तो svn और cvs को संपादित करें
शांत_पॉइंटिन

38

मूल जवाब : यह विंडोज पॉवर्स से बहुत अच्छी तरह से काम करता है:

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

EDIT # 1 : -फिल्टर दोगुना तेज है -Include। यहाँ वह समाधान है:

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

EDIT # 2 : कीथ ई। ट्रूसेडेल ने फ़ाइल में आउटपुट भेजने का उल्लेख किया। उस समाधान के लिए उसकी टिप्पणी देखें। मैं कंसोल आउटपुट पसंद करता हूं। लेकिन उनकी टिप्पणी ने मुझे यह सोचने पर मजबूर कर दिया कि मैं केवल पूर्ण पथ को पसंद करता हूं, न कि पूरी गड़बड़ जो कि डिफ़ॉल्ट रूप से वापस आ जाती है। यदि आप चाहते हैं कि बस पूर्ण पथ, निम्नलिखित का उपयोग करें:

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

अंतिम नोट : उपरोक्त समाधान मौजूदा निर्देशिका के तहत केवल गिट रिपॉजिटरी लौटाते हैं । यदि आप किसी ड्राइव पर सभी रिपॉजिटरी चाहते हैं, तो आपको प्रत्येक ड्राइव के रूट से एक बार कमांड चलाना चाहिए।


1
विंडोज़ उपयोगकर्ताओं के लिए बहुत उपयोगी है! :)
फेलिक्स फेलिसिएंट

2
Get-ChildItem: एक पैरामीटर नहीं पाया जा सकता है जो पैरामीटर नाम 'गुण' से मेल खाता है। लाइन में: 1 चार: 28
देवलैंड स्वानेपेल

@DewaldSwanepoel - मुझे इस बात का कोई मलाल नहीं है कि आप एट्रिब्यूट्स पैरामीटर के बारे में वह त्रुटि क्यों देखेंगे। यह दस्तावेज़ीकरण में स्पष्ट रूप से है, और मैंने इसे कई विंडोज / पॉवरशेल संस्करण संयोजनों पर आजमाया है। विंडोज 7, 8, और 10 सभी मेरे लिए पॉवरशेल के विभिन्न संस्करणों के साथ काम करते हैं। यदि आपको यह पता है कि त्रुटि क्यों हो रही है, तो कृपया इसे यहाँ साझा करें ताकि हम सीख सकें:>)
bopapa_1979

2
@DewaldSwanepoel - आप निश्चित रूप से अपने PowerShell संस्करण को अपग्रेड कर सकते हैं। हम इसे चॉकलेट के साथ करते हैं। मैं वर्तमान में काम पर विंडोज 7 पर PowerShell संस्करण 5.0 चला रहा हूं।
bopapa_1979

1
@ KeithE.Truesdell - मुझे पूरा यकीन है कि "निर्देशिका + छिपी" विशेषताएँ समावेशी हैं, और केवल निर्देशिकाओं को खोजेगी। जोड़ना -डायरेक्टरी मैं PowerShell के नए संस्करणों में तेज हो। मैं समय लेकर आता हूँ। EDIT - "-Directory" को जोड़ने से कोई भौतिक अंतर नहीं पड़ता है, जैसा कि दस्तावेज़ीकरण इंगित करेगा। हालाँकि, आपके द्वारा सुझाए गए निर्देशिका गुण को जोड़ने से यह धीमा हो जाता है। मुझे अब पता है कि क्यों, लेकिन मैंने इसे माप-कमान के साथ दोनों तरीकों से परीक्षण किया और अतिरिक्त निर्देशिका विशेषता के साथ तीनों सभी तीनों की तुलना में धीमे थे।
bopapa_1979

18

* Nix पर, यह कोई --bareरिपॉजिटरी भी पाएगा ।

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

3
बेयर रिपॉजिटरी को name.gitकेवल एक कन्वेंशन नाम दिया जाना चाहिए , जिसका मैं उदाहरण के लिए अनुसरण नहीं करता।
अर्काट्ज जिमेनेज

3
यह देखते हुए कि नंगे रिपोजिटरी को उस नामकरण सम्मेलन का पालन करने की आवश्यकता नहीं है, क्या उन रिपॉजिटरी का एक सार्वभौमिक तरीका है find?
जमलाने

11

Git रिपॉजिटरी सभी में है HEAD, refsऔर objectsप्रविष्टियाँ।

GNU पर / कुछ भी,

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

बस के लिए जाँच .gitकई नंगे repos और submodules याद करेंगे।

जाँच पर पूर्ण-विरोध जाने के लिए, आप पूछ सकते हैं कि मुद्रण से पहले अपनी सभी जाँचें करने के लिए 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

)


4

लिनक्स पर, एक तेज़ तरीका होगा:

locate -r "\.git$"

आप के साथ अद्यतन डेटाबेस का पता लगाने रखने के लिए sudo updatedb


निश्चित रूप से, पता लगाना तेज़ है, इसे सावधानियों के साथ उपयोग करें, यहाँ देखें: unix.stackexchange.com/questions/60205/…
AjayKumarBasuthkar

3

लिनक्स और ओएस एक्स पर निम्नलिखित कमांड संभवतः सबसे तेज है ( .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(यानी, ठीक है)। वर्तमान नोड के रूप में उपलब्ध है {}(जिसे भागने की कोई आवश्यकता नहीं है)
  • -pruneहमेशा होता है true, और सभी बच्चे नोड को छोड़ दिया जाता है
  • -type dहै trueनिर्देशिकाओं के लिए
  • -printयहां जरूरत है क्योंकि अगर -execयह मौजूद है तो इसका निहितार्थ नहीं है

2

लिनक्स पर, इस कमांड को रूट अनुमति के साथ आज़माएँ:

find / | grep \\.git$

यह सिर्फ उन सभी फाइलों को खोजता है जो .it के साथ समाप्त होती हैं ... आप इसे विंडोज, लिनक्स आदि में खोज टूल के साथ कर सकते हैं ...


7
वहाँ findसब कुछ है तो साथ फ़िल्टरिंग उत्पादन बात नहीं है grep। मैं इसके बजाय--name "*.git"
18

2
@Gregory Pakosz: क्या अंतर है?
मिशेल गोकन

11
@ मिचेल, आप 2 प्रक्रियाएं शुरू करते हैं और पहले एक को पाइप के माध्यम /से दूसरे पेड़ को दूसरे के लिए फैलाने के लिए बनाते हैं , जब पहला पहला सब कुछ कर सकता है और विशाल बेकार आईओ उपयोग से बच सकता है। उपयोगकर्ता के लिए सामान्य रूप से वास्तविक अंतर नहीं है, लेकिन बड़े फाइल सिस्टम के लिए यह एक अंतर हो सकता है।
अरकिट्ज जिमेनेज

2
किसी भी तरह से, अगर आप JUST find कमांड का उपयोग करना चाहते हैं, तो -name के बजाय -regex का उपयोग करना बेहतर है ... इस स्थिति में, इस कमांड का उपयोग करें: sudo find / -regex '। * \ "git'
मिशेल

4
@MichelKogan बेहतर क्यों?
मार्क अमेरी

2

एक सरल पॉवरशेल संस्करण:

Get-ChildItem . -Recurse -Hidden .git

1
यह मेरे लिए काम किया! धन्यवाद! मुझे उन कुछ स्थानों के लिए कुछ त्रुटियां मिलीं, जिनके उपयोग की कोशिश की गई थी कि एक सामान्य उपयोगकर्ता के रूप में चलने के लिए पॉवरशेल स्क्रिप्ट तक पहुंच नहीं थी, लेकिन आगे की समीक्षा पर, ये ऐसे स्थान थे जिन्हें मुझे वैसे भी चिंतित नहीं होना चाहिए (यानी - C:\users\<username>\PrintHood इसके अलावा, मैं यह एक फ़ाइल में एक आउटपुट जोड़ने के लिए उपयोगी पाया और जब से मैंने केवल पथ के बारे में परवाह की है (जैसा कि इस स्क्रिप्ट को जानकारी का एक गुच्छा मिलता है) केवल पथ / निर्देशिका जानकारी के लिए फ़िल्टर करने के लिए भी। Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
कीथ ई। ट्रूसेडेल


1

एरिक बुरचम के जवाब से छोटा बदलाव। यह उत्तर समाप्त होने के लिए \ .गित जोड़ता है, यह नहीं है।

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

मैं दिन की शुरुआत में इस कमांड का उपयोग करता हूं। यह बस ऊपर कुछ 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.