Bagaimana Anda mendapatkan nama repositori Git di beberapa repositori Git?


144

Ketika Anda bekerja di beberapa direktori Git, bagaimana Anda bisa mendapatkan nama repositori Git di beberapa repositori Git? Apakah ada perintah 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

Sepertinya ini yang Anda cari. stackoverflow.com/questions/4076239/...
Max Sherman

Tidak, itu mungkin bukan yang dia inginkan. Ini mungkin, meskipun: stackoverflow.com/questions/957928/…
Nevik Rehnel

jika Anda menggunakan node.js Anda dapat mencoba npmjs.com/package/git-repo-name
jonschlinkert

Jawaban:


153

Nah, jika, untuk nama repositori yang Anda maksud adalah nama direktori root Git (yang berisi direktori .git) Anda dapat menjalankan ini:

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

Bagian git rev-parse --show-toplevelmemberi Anda jalan ke direktori itu dan basenamestrip bagian pertama jalan.


9
Seperti @mvp mengatakan di bawah ini, Anda dapat mengubah nama direktori yang berisi .gitsubdirektori, jadi tidak benar bahwa "jika, untuk nama repositori yang Anda maksud adalah nama direktori root git".
sheac

7
Perintah ini memberi Anda persis seperti itu: nama direktori tepat di atas direktori .git. Itu adalah satu interpretasi untuk "nama repositori", dan sepertinya itu yang dicari OP. Jelas ada interpretasi lain yang valid, seperti nama repositori asal remote. Tidak ada kebenaran universal dalam kasus ini dan itu benar-benar tergantung pada apa yang Anda inginkan.
Fuad Saud

1
Tidak berfungsi di windows 8.1 ketika direktori saya terlihat seperti "Project 1.1". Itu hanya menggemakan "Proyek". Ditambah nama folder di sini belum tentu terkait dengan nama repo saya, kan?
Buttle Butkus

Pertanyaan tambahan: bagaimana menambahkan ini menjadi string dalam rantai seperti: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Karena Anda mungkin melihat baris ini tidak akan berfungsi karena menggunakan `` di dalam ``
fearis

1
Ini tidak aman. Coba cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-topleveldan itu akan mengembalikan Anda / var / www / html
sibaz

126

Secara umum, Anda tidak dapat melakukan ini. Git tidak peduli bagaimana repositori git Anda dinamai. Sebagai contoh, Anda dapat mengganti nama direktori yang berisi repositori Anda (satu dengan .gitsubdirektori), dan git bahkan tidak akan menyadarinya - semuanya akan terus berfungsi.

Namun, jika Anda mengkloningnya, Anda dapat menggunakan perintah:

git remote show origin

untuk menampilkan banyak informasi tentang remote asli tempat Anda mengkloning repositori Anda, dan itu akan berisi URL klon asli.

Namun, jika Anda menghapus tautan ke remote menggunakan asli git remote rm origin, atau jika Anda membuat repositori menggunakan git init, informasi seperti itu tidak mungkin diperoleh - itu tidak ada di mana pun.


2
Anda selalu bisa mendapatkan nama cabang menggunakan dengan baik, git branch:) (cabang aktif akan ditandai dengan bintang *).
mvp

95

Tidak perlu menghubungi repositori untuk mendapatkan nama, dan nama folder tidak harus mencerminkan nama jarak jauh.

Saya menemukan ini sebagai cara yang paling akurat dan efisien untuk mendapatkan nama repositori saat ini:

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

Ini seharusnya bekerja pada Git 1.8.1.5. Sebelum ini, perintah yang sekarang sudah usang git-repo-configakan bekerja (sedini Git 1.7.5).


4
Setuju, ini adalah jawaban yang paling bersih (saya dulu punya $ {PWD ## * /} tetapi seperti yang Anda katakan, nama folder saat ini mungkin berbeda dari asalnya)
Vincent De Smet

ya, saya sedang mencari ini, sangat dihargai.! nama folder saya berbeda;)
csomakk

Yang ini juga berfungsi: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

Di git v2.7.0 + , sebuah sub get-url- git-remoteperintah diperkenalkan ke perintah.

Shell POSIX:

basename $(git remote get-url origin)

PowerShell:

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

Saya mendapatkan .gitdi akhir string saya menggunakan metode ini, jadi saya menambahkan split untuk melepasnya:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Jika Anda kebetulan menggunakan ini di Jenkins, Anda akan ingin menghapus baris baru dengan trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

Jawaban lain masih tidak akan berfungsi ketika nama direktori Anda tidak sesuai dengan nama repositori jarak jauh (dan itu bisa). Anda bisa mendapatkan nyata nama repositori dengan sesuatu seperti ini:

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

Pada dasarnya, Anda menelepon git remote show origin, ambil URL repositori dari bidang "Ambil URL:", dan regex untuk mendapatkan bagian dengan nama: https://github.com/dragn/ neat-vimrc .git


1
Ya, ini baik-baik saja, tetapi ini akan meminta remote untuk pembaruan. Lebih baik digunakan git remote show origin -nuntuk mencegah hal itu.
Ryanmt

1
Bisakah kita perbarui perintah sed juga berfungsi ketika url asal tidak diakhiri dengan .git? jadi 'foo.git' menjadi 'foo', tetapi 'foo' juga cocok? Saya kira kita perlu pencocokan non-serakah?
Arnout Engelen

@ArnoutEngelen Saya pikir hal yang paling sederhana untuk dilakukan adalah (secara opsional) menelanjangi .gitpanggilan lain sed, saya telah memperbarui kode dalam jawabannya. Dengan cara ini ia akan berfungsi, ketika URL tidak diakhiri dengan .git.
dragn

Masuk akal! Bagus
Arnout Engelen

7
Lebih sederhana ini sedbekerja lebih baik di Mac OSX saya:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

Jika Anda mencoba mendapatkan nama pengguna atau nama organisasi DAN proyek atau nama repo di github, saya dapat menulis perintah ini yang paling tidak berfungsi untuk saya secara lokal.

 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

Ini adalah hasil yang diinginkan seperti Vydianama organisasi dan gouraminama paket. Gabungan mereka dapat membantu membentuk User/Repojalur lengkap


5

Saya pikir ini adalah cara yang lebih baik untuk secara jelas mengidentifikasi klon repositori.

git config --get remote.origin.urldan memeriksa untuk memastikan bahwa asal cocok ssh://your/repo.


1
Sebenarnya kondisi yang lebih kuat, membutuhkan lebih sedikit penguraian. Mungkin harus menentukan nama url alih-alih nama proyek, tetapi sedikit harga yang harus dibayar. Cara orang lain melakukannya akan rusak jika ". Git" terjadi pada nama repo. Tidak mungkin, tetapi mungkin.
Shane J

1
@ ShaneJ Anda benar dan Anda mendorong saya untuk menulis jawaban saya sendiri yang menangani ". Git" di nama repo asal terpencil: stackoverflow.com/a/58843794/2696867
animatedgif

5

Sedikit terlambat untuk pertanyaan ini, tetapi jika Anda:

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

Anda akan melihat url repositori yang akan menyertakan reponame:

[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

Repo nama lengkap:

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

Dalam pertanyaan tersebut, perusahaan gip menyebutkan berada di suatu tempat jauh di bawah hierarki direktori. Meskipun saya tidak yakin apa yang sebenarnya dia inginkan (ada contoh - mungkin " mendapatkan nama repositori Git dari mana saja dalam repositori Git " (yang bertentangan dengan bagaimana saya membayangkan repositori git)), saya tidak melihat indikasi bahwa / URL harus diketahui.
greybeard

1

Penggunaan pendekatan ini git-remotebekerja dengan baik bagi saya untuk remote HTTPS:

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

Contoh


1

Berikut adalah fungsi bash yang akan mencetak nama repositori (jika sudah diatur dengan benar):

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

Penjelasan:

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

Ini dijalankan git rev-parse --git-dir, yang mencetak path lengkap ke .gitdirektori repositori currrent. Ini menyimpan jalan di $gitdir.

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

Ini dijalankan cat ${gitdir}/description, yang mencetak isi dari .git/descriptionrepositori Anda saat ini. Jika Anda telah menamakan repositori dengan benar, itu akan mencetak nama. Kalau tidak, itu akan mencetakUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Jika repo itu dinamai dengan benar, maka cetak isinya.

else

Jika tidak...

echo "Unnamed repository!"

Beri tahu pengguna bahwa repo tidak bernama.


Hal serupa diterapkan dalam skrip ini .


1

Sayangnya, tampaknya Git tidak memiliki perintah seperti itu. Tetapi Anda dapat dengan mudah menambahkannya sendiri dengan alias Git dan beberapa shell magic.

Seperti yang ditunjukkan oleh jawaban ini , Anda dapat menggunakan git rev-parse --show-topleveluntuk menunjukkan root dari folder Git Anda saat ini.

Jika Anda ingin menggunakan ini secara teratur, mungkin lebih mudah untuk mendefinisikannya sebagai alias. Untuk ini, digunakan git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Setelah ini, Anda dapat menggunakan git rootuntuk melihat folder root dari repositori yang sedang Anda masuki.

Jika Anda ingin menggunakan nama perintah lain selain root, cukup ganti bagian kedua dari alias.rootperintah di atas dengan apa pun yang Anda inginkan.

Untuk detail tentang alias di Git, lihat juga git confighalaman manual .


2
git config --add alias.root 'rev-parse --show-toplevel'- tidak perlu membuang shell untuk alias perintah tunggal.
kostix

1

Jika Anda ingin seluruh nama repositori GitHub ('nama lengkap') - pengguna / repositori, dan Anda ingin melakukannya dengan Ruby ...

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

0

Ini milik saya:

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

tidak lebih baik dari yang lain, tapi saya membuatnya menjadi fungsi bash sehingga saya bisa memasukkan nama jarak jauh jika bukan asal.

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

Juga saya hanya menemukan bahwa ada beberapa informasi repo di dalam .gitdirektori. Jadi Anda bisa menonton FETCH_HEADfile di terminal untuk melihat nama repo:

Contoh:

cd your_project_folder/.git
more FETCH_HEAD

Keluaran:

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

Dan https://bitbucket.org/somebituser/some_repo.gitadalah nama repositori Anda


0

Yang ini bekerja cukup baik dengan git-2.18.2 dan dapat diluncurkan dari repositori target git luar:

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


-1

Anda dapat menggunakan: git remote -v

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

Kelola set repositori ("remote") yang cabangnya Anda lacak. -v --verbose Menjadi sedikit lebih verbose dan tampilkan url jauh setelah nama. CATATAN: Ini harus ditempatkan di antara remote dan sub-perintah.


1
git remote -vhanya mengembalikan satu atau lebih URL. Bagaimana ini menjawab pertanyaan?
Peter Mortensen

Seperti yang dinyatakan sebelumnya, ini hanya mengembalikan URL ... dan mengembalikan 2 URL yang dipisahkan oleh satu baris, dengan karakter yang tidak perlu sebelum URL. SO itu menciptakan masalah dengan memasukkan info yang tidak dibutuhkan, kemudian menyajikan dua jalur untuk mencari, maka itu masih tidak mendapatkan nama repo.
Andrew
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.