कुछ गिट रिपॉजिटरी में आपको Git रिपॉजिटरी का नाम कैसे मिलता है?


144

जब आप कुछ Git निर्देशिका में काम कर रहे हैं, तो आप कुछ Git रिपॉजिटरी में Git रिपॉजिटरी नाम कैसे प्राप्त कर सकते हैं? क्या कोई Git कमांड हैं?

# I did check out bar repository and working in somewhere 
# under bar directory at this moment such as below.

$ git clone git://github.com/foo/bar.git
$ cd bar/baz/qux/quux/corge/grault # and I am working in here!
$ git xxx # <- ???
bar

ऐसा लगता है कि यह आपके बाद है। stackoverflow.com/questions/4076239/…
मैक्स शर्मन

नहीं, वह शायद वह नहीं है जो वह चाहता है। यह हो सकता है, हालांकि: stackoverflow.com/questions/957928/…
नेव्हिक रेहेल

यदि आप नोड का उपयोग करते हैं। तो क्या आप npmjs.com/package/git-repo-name
jonschlinkert

जवाबों:


153

ठीक है, अगर, रिपॉजिटरी नाम के लिए आपका मतलब गेट रूट डायरेक्टरी नाम (एक है जिसमें .गित डायरेक्टरी है) जिसे आप चला सकते हैं:

basename `git rev-parse --show-toplevel`

git rev-parse --show-toplevelभाग आप उस निर्देशिका के लिए पथ देता है और basenameपथ के पहले भाग स्ट्रिप्स।


9
जैसा कि @mvp नीचे कहता है, आप .gitउपनिर्देशिका वाली निर्देशिका का नाम बदल सकते हैं , इसलिए यह सच नहीं है कि "यदि, रिपॉजिटरी नाम के लिए आपका अर्थ गिट रूट निर्देशिका नाम है"।
1

7
यह कमांड आपको बिल्कुल वही देता है: निर्देशिका का नाम सीधे .it dir के ऊपर। यह "रिपॉजिटरी के नाम" के लिए एक व्याख्या है, और ऐसा लगता है कि यह एक ओपी की तलाश थी। स्पष्ट रूप से अन्य मान्य व्याख्याएं हैं, जैसे दूरस्थ मूल भंडार का नाम। इस मामले में कोई सार्वभौमिक सच्चाई नहीं है और यह वास्तव में इस पर निर्भर करता है कि आप क्या चाहते हैं।
फुआद सऊद

1
विंडोज 8.1 में काम नहीं करता है जब मेरी निर्देशिका "प्रोजेक्ट 1.1" की तरह दिखती है। यह केवल "प्रोजेक्ट" गूँजता है। इसके अलावा यहाँ फ़ोल्डर नाम आवश्यक रूप से मेरे रेपो नाम से संबंधित नहीं है, है ना?
बटलर बटुक

अतिरिक्त प्रश्न: कैसे इसे जोड़ने के लिए श्रृंखला लाइन में एक स्ट्रिंग हो जैसे: git sed -n '1 p' test.ip | basename Remote add test "admin @ basename` git rev-parse --show-toplevel: / var / www "?? जैसा कि आप शायद देखते हैं कि यह लाइन `` `के
अंदर`

1
यह सुरक्षित नहीं है। प्रयास करें सीडी / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevelऔर यह आपको दे देंगे वापस / var / www / html
sibaz

126

सामान्य तौर पर, आप ऐसा नहीं कर सकते। Git परवाह नहीं करता है कि आपके git रिपॉजिटरी का नाम कैसे है। उदाहरण के लिए, आप अपनी रिपॉजिटरी (एक .gitउपनिर्देशिका के साथ ) वाली निर्देशिका का नाम बदल सकते हैं , और गिट भी इसे नोटिस नहीं करेंगे - सब कुछ काम करना जारी रखेगा।

हालाँकि, यदि आपने इसे क्लोन किया है, तो आप कमांड का उपयोग कर सकते हैं:

git remote show origin

मूल दूरस्थ के बारे में बहुत सी जानकारी प्रदर्शित करने के लिए जिसे आपने अपने रिपॉजिटरी से क्लोन किया था, और इसमें मूल क्लोन URL होगा।

यदि, हालांकि, आपने मूल रिमोट का उपयोग करके लिंक को हटा दिया है git remote rm origin, या यदि आपने उस रिपॉजिटरी का उपयोग करके बनाया है git init, तो ऐसी जानकारी प्राप्त करना केवल असंभव है - यह कहीं भी मौजूद नहीं है।


2
आप हमेशा अच्छी तरह से उपयोग करके शाखा का नाम प्राप्त कर सकते हैं, git branch:) (सक्रिय शाखा को स्टार के साथ चिह्नित किया जाएगा *)।
एमवीपी

95

नाम प्राप्त करने के लिए रिपॉजिटरी से संपर्क करने की कोई आवश्यकता नहीं है, और फ़ोल्डर का नाम आवश्यक रूप से दूरस्थ नाम को प्रतिबिंबित नहीं करेगा।

मैंने वर्तमान रिपॉजिटरी नाम पाने के लिए इसे सबसे सटीक और कुशल तरीका माना है:

basename -s .git `git config --get remote.origin.url`

यह Git 1.8.1.5 के रूप में काम करना चाहिए। इससे पहले, अब पदावनत git-repo-configकमांड ने काम किया होगा (जितनी जल्दी Git 1.7.5)।


4
सहमत, यह सबसे साफ जवाब है (मेरे पास $ {PWD ## * /} हुआ करता था लेकिन जैसा कि आप कहते हैं, वर्तमान फ़ोल्डर का नाम मूल से अलग हो सकता है)
विंसेंट डी स्मेट

हाँ, मैं इस के लिए देख रहा था, बहुत सराहना की।! मेरा फ़ोल्डर नाम अलग है;)
15

यह भी काम करता है: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

में Git v2.7.0 + , एक subcommand get-urlपेश किया गया था git-remoteआदेश।

POSIX खोल:

basename $(git remote get-url origin)

शक्ति कोशिका:

Split-Path -Leaf (git remote get-url origin)

मुझे .gitइस विधि का उपयोग करके अपने स्ट्रिंग के अंत में मिलता है , इसलिए मैंने इसे अलग करने के लिए एक विभाजन जोड़ा:(git remote get-url origin | Split-Path -leaf).split('.')[0]
मैक्स Cascone

यदि आप जेनकिंस में इसका उपयोग करते हैं, तो आप एक नई तरकीब के साथ पीछे हटना चाहते हैं trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

अन्य उत्तर तब भी काम नहीं करेंगे जब आपकी निर्देशिका का नाम दूरस्थ रिपॉजिटरी नाम (और यह हो सकता है) के अनुरूप नहीं है। आप इस तरह से कुछ के साथ भंडार का असली नाम प्राप्त कर सकते हैं :

git remote show origin -n | grep "Fetch URL:" | sed -E "s#^.*/(.*)$#\1#" | sed "s#.git$##"

मूल रूप से, आप कॉल करते हैं git remote show origin, "Fetch URL:" फ़ील्ड से रिपॉजिटरी URL लेते हैं, और नाम के साथ भाग प्राप्त करने के लिए इसे regex करते हैं: https://github.com/dragn/ नीट-विम-आर्केड .git


1
हाँ, यह ठीक है, लेकिन यह अपडेट के लिए रिमोट को क्वेरी करेगा। इसे git remote show origin -nरोकने के लिए उपयोग करना बेहतर है।
रयानमैट

1
जब हम मूल url को .गित में समाप्त नहीं करते हैं तो क्या हम sed कमांड को भी काम कर सकते हैं? इसलिए 'फू.गीत' 'फू' बन जाता है, लेकिन 'फू' का भी मिलान किया जाता है? मुझे लगता है कि हमें गैर-लालची मिलान की आवश्यकता है?
अर्नोट एंगेलन

@ArnoutEngelen मुझे लगता है कि .gitएक और कॉल के साथ (वैकल्पिक रूप से) स्ट्रिप करना सबसे आसान काम है sed, मैंने जवाब में कोड अपडेट किया है। इस तरह से यह काम करेगा, जब यूआरएल के साथ समाप्त नहीं होगा .git
8

समझ में आता है! अच्छा था!
अर्नोट एंगेलन

7
इस सरल sedने मेरे मैक OSX पर बेहतर काम किया:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

यदि आप उपयोगकर्ता नाम या संगठन का नाम और प्रोजेक्ट या रेथो का नाम जीथब पर लेने का प्रयास कर रहे हैं, तो मैं इस कमांड को लिखने में सक्षम था जो मेरे लिए स्थानीय स्तर पर काम करता है।

 git config --get remote.origin.url
# => https://github.com/Vydia/gourami.git

 git config --get remote.origin.url | sed 's/.*\/\([^ ]*\/[^.]*\).*/\1/' # Capture last 2 path segments before the dot in .git
# => Vydia/gourami

यह वांछित परिणाम है जैसा Vydiaकि संगठन का नाम है और gouramiपैकेज नाम है। संयुक्त वे पूर्ण बनाने में मदद कर सकते हैंUser/Repo पथ


5

मुझे लगता है कि यह एक भंडार के क्लोन को स्पष्ट रूप से पहचानने का एक बेहतर तरीका है।

git config --get remote.origin.urlऔर यह सुनिश्चित करने के लिए जाँच कर रहा है कि मूल मेल खाता है ssh://your/repo


1
वास्तव में एक मजबूत स्थिति, कम पार्सिंग की आवश्यकता होती है। परियोजना के नाम के बजाय url नाम निर्दिष्ट करना पड़ सकता है, लेकिन भुगतान करने के लिए एक छोटी सी कीमत। जिस तरह से हर कोई इसे कर रहा है वह टूट जाएगा अगर ".गित" रेपो नाम में हुआ। अकारण, लेकिन संभव है।
शेन जे

1
@ShaneJ आप सही हैं और आपने मुझे अपना उत्तर लिखने के लिए प्रेरित किया जो दूरस्थ मूल रेपो नाम में ".itit" को हैंडल करता है: stackoverflow.com/a/58843794/2696867
animatedgif

5

इस सवाल के लिए थोड़ी देर, लेकिन अगर आप:

cat /path/to/repo/.git/config

आप रिपॉजिटरी का url देखेंगे जिसमें रिपॉजिट शामिल होगा:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/your_git_user_name/your_git_repo_name.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

2

रेपो का पूरा नाम:

git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"

इस सवाल में, जिप्पकैमनी ने निर्देशिका पदानुक्रम के नीचे कहीं गहरे होने का उल्लेख किया है। हालांकि मुझे यकीन नहीं है कि वह वास्तव में क्या चाहता है (इसका एक उदाहरण है - " Git रिपॉजिटरी में कहीं से भी Git रिपॉजिटरी नाम प्राप्त हो सकता है " (जो कि मैं git रिपॉजिटरी की कल्पना कैसे करता हूं) के साथ है), मुझे कोई इंडेंट नहीं दिखता है / URL ज्ञात होना चाहिए।
ग्रेबियर्ड जुड

1

git-remoteHTTPS रीमोट के लिए यह तरीका मेरे लिए अच्छा काम कर रहा है :

$ git remote -v | grep "(fetch)" | sed 's/.*\/\([^ ]*\)\/.*/\1/'
                                                |  |        | |
                                                |  |        | +---------------+
                                                |  |        | Extract capture |
                                                |  +--------------------+-----+
                                                |Repository name capture|
                                                +-----------------------+

उदाहरण


1

यहाँ एक बश फ़ंक्शन है जो रिपॉजिटरी नाम को प्रिंट करेगा (यदि इसे ठीक से सेट किया गया है):

__get_reponame ()
{
    local gitdir=$(git rev-parse --git-dir)

    if [ $(cat ${gitdir}/description) != "Unnamed repository; edit this file 'description' to name the repository." ]; then
        cat ${gitdir}/description
    else
        echo "Unnamed repository!"
    fi
}

स्पष्टीकरण:

local gitdir=$(git rev-parse --git-dir)

यह निष्पादित करता है git rev-parse --git-dir, जो .gitकि धारा रिपॉजिटरी की निर्देशिका के लिए पूरा रास्ता प्रिंट करता है। इसमें पथ संग्रहीत करता है $gitdir

if [ $(cat ${gitdir}/description) != "..." ]; then

यह निष्पादित करता है cat ${gitdir}/description, जो .git/descriptionआपके वर्तमान रिपॉजिटरी की सामग्री को प्रिंट करता है। यदि आपने अपने रिपॉजिटरी का नाम ठीक से रखा है, तो यह एक नाम प्रिंट करेगा। नहीं तो छपेगाUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

यदि रेपो ठीक से नामित था, तो सामग्री प्रिंट करें।

else

अन्यथा...

echo "Unnamed repository!"

उपयोगकर्ता को बताएं कि रेपो अनाम था।


कुछ ऐसा ही इस लिपि में लागू है ।


1

दुर्भाग्य से, ऐसा लगता है कि Git में ऐसा कोई कमांड नहीं बनाया गया है। लेकिन आप इसे आसानी से Git उपनाम और कुछ शेल मैजिक के साथ जोड़ सकते हैं।

जैसा कि इस उत्तर द्वारा बताया गया है , आप git rev-parse --show-toplevelअपने वर्तमान Git फ़ोल्डर की जड़ दिखाने के लिए उपयोग कर सकते हैं ।

यदि आप इसे नियमित रूप से उपयोग करना चाहते हैं, तो संभवतः इसे एक उपनाम के रूप में परिभाषित करना अधिक सुविधाजनक है। इसके लिए, का उपयोग किया git config alias.root '!echo "$(git rev-parse --show-toplevel)"'। इसके बाद, आप git rootउस रिपॉजिटरी के रूट फ़ोल्डर को देखने के लिए उपयोग कर सकते हैं जो आप वर्तमान में हैं।

यदि आप किसी अन्य उपकमांड नाम का उपयोग करना चाहते हैं root, तो बस alias.rootऊपर दिए गए कमांड के दूसरे भाग को आप जो चाहें, उसके साथ बदलें ।

Git में उपनामों के विवरण के लिए, git configमैन पेज भी देखें ।


2
git config --add alias.root 'rev-parse --show-toplevel'- एकल-कमांड उपनाम के लिए शेल में फेंकने की कोई आवश्यकता नहीं है।
कोस्टिक्स

1

यदि आप संपूर्ण GitHub रिपॉजिटरी नाम ('पूरा नाम') चाहते हैं - उपयोगकर्ता / रिपॉजिटरी, और आप इसे Ruby के साथ करना चाहते हैं ...

git remote show origin -n | ruby -ne 'puts /^\s*Fetch.*:(.*).git/.match($_)[1] rescue nil'

0

ये मेरा:

git remote --verbose | grep origin | grep fetch | cut -f2 | cut -d' ' -f1

दूसरों की तुलना में बेहतर नहीं है, लेकिन मैंने इसे एक बाश फ़ंक्शन बनाया ताकि मैं मूल नाम में ड्रॉप कर सकूं अगर यह मूल नहीं है।

grurl () {
  xx_remote=$1
  [ -z "$xx_remote" ] && xx_remote=origin
  git remote --verbose | grep "$1" | grep fetch | cut -f2 | cut -d' ' -f1
  unset xx_remote
}

0

इसके अलावा, मुझे लगता है कि .gitनिर्देशिका के अंदर कुछ रेपो जानकारी है । तो आप बस देख सकते हैंFETCH_HEAD रेपो का नाम देखने के लिए टर्मिनल में फ़ाइल हैं:

उदाहरण:

cd your_project_folder/.git
more FETCH_HEAD

आउटपुट:

672e38391557a192ab23a632d160ef37449c56ac        https://bitbucket.org/fonjeekay/some_repo

और https://bitbucket.org/somebituser/some_repo.gitआपके भंडार का नाम है


0

यह एक बहुत अच्छी तरह से git-2.18.2 के साथ काम करता है और इसे git लक्ष्य रिपॉजिटरी के बाहर से लॉन्च किया जा सकता है:

basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)


-1

आप उपयोग कर सकते हैं: git रिमोट -v

प्रलेखन: https://git-scm.com/docs/git-remote

रिपॉजिटरी के सेट ("रीमोट्स") को प्रबंधित करें जिनकी शाखाएं आप ट्रैक करते हैं। -v --verbose थोड़ा और क्रिया हो और नाम के बाद दूरस्थ url दिखाएं। नोट: इसे दूरस्थ और उपकमांड के बीच रखा जाना चाहिए।


1
git remote -vकेवल एक या अधिक URL लौटा रहा है। यह सवाल का जवाब कैसे दे रहा है?
पीटर मॉर्टेंसन

जैसा कि पहले कहा गया था, यह केवल URL देता है ... और यह URL से पहले अनावश्यक वर्णों के साथ पंक्ति विराम द्वारा अलग किए गए 2 URL देता है। तो यह अनावश्यक जानकारी शामिल करके एक समस्या बनाता है, फिर खोज के लिए दो रास्ते प्रस्तुत करता है, फिर भी इसे रेपो का नाम नहीं मिलता है।
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.