Git deposunun adını bazı Git deposunda nasıl edinebilirsiniz?


144

Bazı Git dizininde çalışırken, Git deposundaki Git depo adını nasıl alabilirsiniz? Git komutları var mı?

# 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

Bu senin peşinde olduğun gibi görünüyor. stackoverflow.com/questions/4076239/…
Max Sherman

Hayır, muhtemelen istediği bu değil. Bu olabilir: stackoverflow.com/questions/957928/…
Nevik Rehnel

Eğer node.js kullanırsanız deneyebilirsiniz npmjs.com/package/git-repo-name
jonschlinkert

Yanıtlar:


153

Havuz adı için Git kök dizin adını (.git dizinini içeren ad) kastediyorsanız, bunu çalıştırabilirsiniz:

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

git rev-parse --show-toplevelBölüm sana o dizinin yolunu verir ve basenameyolun ilk kısmını soyarak.


9
@Mvp'nin aşağıda belirttiği gibi, .gitalt dizini içeren dizinin adını değiştirebilirsiniz , bu nedenle "havuz adı için git kök dizin adını kastediyorsanız" doğru değildir.
sheac

7
Bu komut size tam olarak şunu verir: dizinin doğrudan .git dir. Bu, "deponun adı" için bir yorumdur ve OP'nin aradığı şey budur. Açıkça görülüyor ki, uzak kaynak deposunun adı gibi başka geçerli yorumlar da var. Bu durumda evrensel bir gerçek yoktur ve bu gerçekten ne istediğinize bağlıdır.
Fuad Saud

1
Dizim "Project 1.1" gibi göründüğünde Windows 8.1'de çalışmaz. Sadece "Proje" yi yansıtır. Ayrıca buradaki klasör adı mutlaka repo adımla ilgili değil, değil mi?
Buttle Butkus

Ek soru: nasıl zincir hattında bir dize olarak eklemek için: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Muhtemelen gördüğünüz gibi, bu çizgi işe yaramayacak çünkü
fearis

1
Bu güvenli değil. Cd / var / www / html'yi deneyin git --git-dir=<some git repo>/.git rev-parse --show-toplevelve size geri / var / www / html
sibaz

126

Genel olarak bunu yapamazsınız. Git, git deponuzun nasıl adlandırıldığını umursamıyor. Örneğin, deponuzu ( .gitalt dizini olan) içeren dizini yeniden adlandırabilirsiniz ve git bile fark etmez - her şey çalışmaya devam eder.

Ancak, klonladıysanız, şu komutu kullanabilirsiniz:

git remote show origin

deponuzu kopyaladığınız orijinal uzaktan kumanda hakkında birçok bilgi görüntülemek için orijinal klon URL'sini içerecektir.

Bununla birlikte, orijinal uzaktan kumanda bağlantısını kaldırdıysanız git remote rm originveya bu havuzu kullanarak oluşturduysanız git init, bu tür bilgileri elde etmek imkansızdır - hiçbir yerde mevcut değildir.


2
Şube adını her zaman iyi kullanarak alabilirsiniz git branch:) (etkin dal yıldızla işaretlenir *).
mvp

95

Adı almak için depoya başvurmanıza gerek yoktur ve klasör adı uzak adı yansıtmayabilir.

Bu, mevcut depo adını almanın en doğru ve etkili yolu olarak buldum:

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

Bu Git 1.8.1.5'ten itibaren çalışmalıdır. Bundan önce, şimdi kullanımdan kaldırılmış git-repo-configkomut işe yarardı (Git 1.7.5 kadar erken).


4
Kabul ediyorum, bu en temiz cevap (eskiden $ {PWD ## * /} var, ama dediğin gibi, mevcut klasör adı başlangıç ​​noktasından farklı olabilir)
Vincent De Smet

Evet, ben, çok takdir arıyordum.! benim klasör adım farklı;)
csomakk

Bu da işe yarıyor: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

Gelen git v2.7.0 + , bir alt komutu get-urltanıtıldı git-remotekomuta.

POSIX kabuğu:

basename $(git remote get-url origin)

Güç kalkanı:

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

Ben .gitbu yöntemi kullanarak benim dize sonunda almak, bu yüzden onu ayırmak için bir bölünme ekledi:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Jenkins'te bunu kullanıyorsanız, takip eden yeni satırı şu şekilde çıkarmak istersiniz trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

Dizininizin adı uzak depo adına karşılık gelmediğinde (ve çalışabiliyorsa) diğer yanıtlar yine de çalışmaz. Sen alabilirsiniz gerçek böyle bir şey ile deponun adını:

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

Temel olarak, çağırır git remote show origin, "URL Al:" alanından depo URL'sini alır ve https://github.com/dragn/ neat- vimrc .git adındaki bölümü almak için yeniden düzenlersiniz.


1
Evet, bu iyi, ama bu uzaktan kumandayı güncelleme için sorgulayacaktır. Bunu git remote show origin -nönlemek için kullanmak daha iyidir .
Ryanmt

1
Kaynak url .git ile bitmediğinde sed komutunu da çalıştırabilir miyiz? yani 'foo.git' 'foo' olur, ama 'foo' da eşleştirilir mi? Açgözlü olmayan eşleşmeye ihtiyacımız var sanırım?
Arnout Engelen

@ArnoutEngelen Ben yapmak için en basit şey (isteğe bağlı olarak) .gitbaşka bir çağrı ile şerit olduğunu düşünüyorum sed, cevap kodu güncelledim. Bu şekilde, URL bitmediğinde çalışır .git.
dragn

Mantıklı! İyi bir!
Arnout Engelen

7
Bu daha basit sedMac git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
OSX'imde

6

Github'da kullanıcı adını veya kuruluş adını VE proje veya repo adını almaya çalışıyorsanız, en azından benim için yerel olarak çalışan bu komutu yazabildim.

 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

Bu, Vydiakuruluş adı ve gouramipaket adı gibi istenen sonuçtur . Kombine, tam User/Repoyolun oluşturulmasına yardımcı olabilirler


5

Bence bu, bir havuzun klonunu açık bir şekilde tanımlamanın daha iyi bir yolu .

git config --get remote.origin.urlve başlangıç ​​noktasının eşleştiğinden emin olmak için kontrol edin ssh://your/repo.


1
Aslında daha güçlü bir durum, daha az ayrıştırma gerektirir. Proje adı yerine URL adını belirtmek zorunda kalabilir, ancak küçük bir bedel ödemek zorunda kalabilirsiniz. Repo adında ".git" olursa herkesin bunu yapması bozulur. Olası değil, ama mümkün.
Shane J

1
@ShaneJ haklısın ve uzak kaynak repo adında ".git" i işleyen kendi cevabımı yazmamı istedin: stackoverflow.com/a/58843794/2696867
animatedgif

5

Bu soru için biraz geç, ama eğer:

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

Reponame'i içeren deponun URL'sini göreceksiniz:

[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

Tam adı kopyala:

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

Soruda, gipcompany dizin hiyerarşisinin derinliklerinde bir yerden bahsediyor. Yani, gerçekten istediği emin neyi olduğum sürece (bir örnek var - belki "olmak Git deposu ki herhangi bir yerden Git deposu adını almak I) git depoları nasıl hayal ile çelişmektedir ("), ben hiçbir belirti bakın / URL bilinmelidir.
greybeard

1

git-remoteHTTPS uzaktan kumandaları için bu yaklaşım benim için iyi çalıştı:

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

Misal


1

Havuz adını (düzgün bir şekilde ayarlanmışsa) yazdıracak bir bash işlevi şunlardır:

__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
}

Açıklama:

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

Bu , geçerli depo dizininin git rev-parse --git-dirtam yolunu yazdıran .gityürütülür. Yolu saklar $gitdir.

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

Bu cat ${gitdir}/description, .git/descriptiongeçerli deponuzun içeriğini yazdırır . Deponuzu doğru şekilde adlandırdıysanız, bir ad yazdırılır. Aksi takdirde, yazdırılacaktırUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Repo düzgün adlandırılmışsa, içeriği yazdırın.

else

Aksi takdirde...

echo "Unnamed repository!"

Kullanıcıya repo'nun adının yazılı olmadığını söyleyin.


Bu komut dosyasında benzer bir şey uygulanır .


1

Ne yazık ki, Git'in yerleşik bir komutu yok gibi görünüyor. Ama Git takma adları ve biraz kabuk büyüsü ile kolayca kendiniz ekleyebilirsiniz.

Bu cevabın işaret ettiği gibi git rev-parse --show-toplevel, mevcut Git klasörünüzün kökünü göstermek için kullanabilirsiniz .

Bunu düzenli olarak kullanmak istiyorsanız, muhtemelen bir takma ad olarak tanımlamak daha uygundur. Bunun için kullanılır git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Bundan sonra, git rootiçinde bulunduğunuz havuzun kök klasörünü görmek için kullanabilirsiniz .

Başka bir alt komut adı kullanmak istiyorsanız root,alias.root , yukarıdaki komutun .

Git'teki takma adlarla ilgili ayrıntılar için ayrıca git configman sayfasına bakın .


2
git config --add alias.root 'rev-parse --show-toplevel'- tek komutlu bir takma ad için kabuğu atmanıza gerek yoktur.
kostix

1

Tüm GitHub veri havuzu adını ('tam ad') - kullanıcı / veri havuzu istiyorsanız ve Ruby ile yapmak istiyorsanız ...

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

0

Benimki burada:

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

diğerlerinden daha iyi değil, ama bir bash işlevi yaptım, böylece orijin değilse uzak adı bırakabilirim.

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

Ayrıca sadece .gitdizin içinde bazı repo bilgi olduğunu bulmak . Böylece FETCH_HEADrepo'nun adını görmek için terminaldeki dosyayı izleyebilirsiniz :

Misal:

cd your_project_folder/.git
more FETCH_HEAD

Çıktı:

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

Ve https://bitbucket.org/somebituser/some_repo.gitdeponuzun adı


0

Bu git-2.18.2 ile oldukça iyi çalışır ve git git hedef havuzunun dışından başlatılabilir:

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


-1

Şunu kullanabilirsiniz: git remote -v

Belgeler: https://git-scm.com/docs/git-remote

Dallarını izlediğiniz havuz kümesini ("uzaktan kumandalar") yönetin. -v --verbose Biraz daha ayrıntılı olun ve addan sonra uzak URL'yi gösterin. NOT: Bu, uzaktan kumanda ve alt komut arasına yerleştirilmelidir.


1
git remote -vyalnızca bir veya daha fazla URL döndürüyor. Bu soruyu nasıl cevaplıyor?
Peter Mortensen

Daha önce belirtildiği gibi, bu yalnızca URL'leri döndürür ... ve URL'den önce gereksiz karakterlerle satır sonu ile ayrılmış 2 URL döndürür. Bu yüzden gereksiz bilgileri ekleyerek bir sorun yaratır, daha sonra arama yapmak için iki yol sunar, sonra yine de repo adını almaz.
Andrew
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.