คุณจะได้ชื่อของที่เก็บ Git ในที่เก็บ 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/…
Max Sherman

ไม่นั่นอาจไม่ใช่สิ่งที่เขาต้องการ แม้ว่านี่อาจเป็น: stackoverflow.com/questions/957928/…
Nevik Rehnel

ถ้าคุณใช้ node.js คุณสามารถลองnpmjs.com/package/git-repo-name
jonschlinkert

คำตอบ:


153

ดีถ้าสำหรับชื่อที่เก็บคุณหมายถึงชื่อไดเรกทอรีราก Git (ที่มีไดเรกทอรี. git) คุณสามารถเรียกใช้นี้:

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

git rev-parse --show-toplevelส่วนช่วยให้คุณมีเส้นทางไปยังไดเรกทอรีนั้นและbasenameแถบส่วนแรกของเส้นทาง


9
ดังที่ @mvp บอกไว้ด้านล่างคุณสามารถเปลี่ยนชื่อของไดเรกทอรีที่มี.gitไดเรกทอรีย่อยดังนั้นจึงไม่เป็นความจริงที่ "ถ้าสำหรับชื่อพื้นที่เก็บข้อมูลคุณหมายถึงชื่อไดเรกทอรีราก git"
sheac

7
คำสั่งนี้ให้คุณอย่างแน่นอน: ชื่อของไดเรกทอรีโดยตรงเหนือ. git dir นั่นคือการตีความหนึ่งสำหรับ "ชื่อของที่เก็บ" และดูเหมือนว่าหนึ่ง OP กำลังมองหา เห็นได้ชัดว่ามีการตีความที่ถูกต้องอื่น ๆ เช่นชื่อของที่เก็บแหล่งกำเนิดระยะไกล ในกรณีนี้ไม่มีความจริงสากลและขึ้นอยู่กับสิ่งที่คุณต้องการ
Fuad Saud

1
ไม่ทำงานใน windows 8.1 เมื่อไดเรกทอรีของฉันดูเหมือนว่า "Project 1.1" มันสะท้อนถึง "โครงการ" เท่านั้น รวมทั้งชื่อโฟลเดอร์ที่นี่ไม่จำเป็นต้องเกี่ยวข้องกับชื่อ repo ของฉันใช่ไหม?
Buttle Butkus

คำถามเพิ่มเติม: วิธีเพิ่มให้เป็นสตริงในสายโซ่เช่น: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? อย่างที่คุณอาจเห็นว่าบรรทัดนี้จะไม่ทำให้เกิดการใช้ ``
Inside

1
มันไม่ปลอดภัย ลอง cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevelแล้วมันจะคืนให้คุณ / var / www / html
sibaz

126

โดยทั่วไปแล้วคุณไม่สามารถทำได้ Git ไม่สนใจว่าที่เก็บ git ของคุณตั้งชื่ออย่างไร ตัวอย่างเช่นคุณสามารถเปลี่ยนชื่อไดเรกทอรีที่มีที่เก็บของคุณ (หนึ่งที่มี.gitไดเรกทอรีย่อย) และ git จะไม่ได้สังเกตเห็นมัน - ทุกอย่างจะทำงานต่อไป

อย่างไรก็ตามหากคุณทำการโคลนคุณสามารถใช้คำสั่ง:

git remote show origin

เพื่อแสดงข้อมูลจำนวนมากเกี่ยวกับรีโมตดั้งเดิมที่คุณโคลนที่เก็บของคุณและจะมี URL โคลนต้นฉบับ

อย่างไรก็ตามหากคุณลบลิงก์ไปยังรีโมตเดิมโดยใช้git remote rm originหรือถ้าคุณสร้างที่เก็บนั้นโดยใช้git initข้อมูลดังกล่าวเป็นไปไม่ได้ที่จะได้รับมันไม่มีอยู่ที่ใดเลย


2
คุณสามารถรับชื่อสาขาได้โดยใช้git branch:) (สาขาที่ใช้งานจะถูกทำเครื่องหมายด้วยดาว*)
mvp

95

ไม่จำเป็นต้องติดต่อที่เก็บเพื่อรับชื่อและชื่อโฟลเดอร์ไม่จำเป็นต้องสะท้อนถึงชื่อระยะไกล

ฉันพบสิ่งนี้เป็นวิธีที่แม่นยำและมีประสิทธิภาพมากที่สุดในการรับชื่อที่เก็บปัจจุบัน:

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

สิ่งนี้ควรใช้งานได้ตั้งแต่ Git 1.8.1.5 ก่อนหน้านี้git-repo-configคำสั่งที่เลิกใช้ตอนนี้จะใช้ได้ (เร็วเท่า Git 1.7.5)


4
ตกลงนี้เป็นคำตอบที่สะอาดที่สุด (ผมเคยมี $ {PWD ## * /} แต่อย่างที่คุณบอกว่าชื่อโฟลเดอร์ปัจจุบันอาจแตกต่างจากแหล่งกำเนิด)
วินเซนต์ De Smet

ใช่ฉันกำลังมองหาสิ่งนี้ชื่นชมมาก! ชื่อโฟลเดอร์ของฉันแตกต่างกัน;)
csomakk

อันนี้ใช้งานได้: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

ในgit v2.7.0 +คำสั่งย่อยget-urlถูกนำมาใช้กับgit-remoteคำสั่ง

เปลือก POSIX:

basename $(git remote get-url origin)

PowerShell:

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

ฉันได้รับ.gitในตอนท้ายของสตริงของฉันโดยใช้วิธีนี้ดังนั้นฉันเพิ่มแยกเพื่อดึงมันออก:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max 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ใช้รับ URL ที่เก็บจากฟิลด์ "เรียก URL:" และสร้างมันใหม่เพื่อรับส่วนที่มีชื่อ: https://github.com/dragn/ เรียบร้อย -vimrc .git


1
ใช่มันก็โอเค แต่มันจะทำการสอบถามรีโมตสำหรับการอัพเดท มันจะดีกว่าที่จะใช้git remote show origin -nเพื่อป้องกันไม่ให้
Ryanmt

1
เราสามารถอัปเดตคำสั่ง sed เพื่อให้ทำงานได้เมื่อ url ต้นทางไม่ลงท้ายด้วย. git หรือไม่ ดังนั้น 'foo.git' จึงกลายเป็น 'foo' แต่ 'foo' ก็ตรงกันเช่นกัน ฉันเดาว่าเราต้องการการจับคู่ที่ไม่โลภ?
Arnout Engelen

@ArnoutEngelen ฉันคิดว่าสิ่งที่ง่ายที่สุดที่ต้องทำคือตัด (เป็นทางเลือก) .gitด้วยการโทรอีกครั้งsedฉันได้อัปเดตโค้ดในคำตอบ วิธีนี้มันจะทำงานเมื่อ URL .gitไม่ได้จบลงด้วย
dragn

มีเหตุผล! สิ่งที่ดี!
Arnout Engelen

7
ความเรียบง่ายนี้sedทำงานได้ดีขึ้นบน Mac OSX ของฉัน:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

หากคุณพยายามรับชื่อผู้ใช้หรือชื่อองค์กรและชื่อโครงการหรือชื่อ repo บน github ฉันสามารถเขียนคำสั่งนี้ซึ่งทำงานให้ฉันภายในเครื่องอย่างน้อยที่สุด

 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.urlssh://your/repoและการตรวจสอบเพื่อให้แน่ใจว่าการแข่งขันที่แหล่งกำเนิด


1
จริง ๆ แล้วเป็นเงื่อนไขที่แข็งแกร่งต้องแยกวิเคราะห์น้อย อาจต้องระบุชื่อ URL แทนที่จะเป็นชื่อโครงการ แต่ต้องเสียค่าใช้จ่ายเล็กน้อย วิธีที่คนอื่นทำมันจะแตกถ้า ".git" เกิดขึ้นในชื่อ repo ไม่น่าเป็นไปได้ แต่เป็นไปได้
เชน J

1
@ShaneJ คุณพูดถูกและได้รับคำสั่งให้ฉันเขียนคำตอบของฉันเองซึ่งจัดการ ".git" ในชื่อ repo ที่มาทางไกล: stackoverflow.com/a/58843794/2696867
animatedgif

5

สายเกินไปสำหรับคำถามนี้ แต่ถ้าคุณ:

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

คุณจะเห็น URL ของที่เก็บซึ่งจะรวมถึง 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 ชื่อเต็ม:

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

ในคำถามที่ gipcompany กล่าวถึงที่ลึกลงไปในลำดับชั้นไดเรกทอรี ในขณะที่ฉันไม่แน่ใจว่าสิ่งที่เขาต้องการจริง ๆ (มีตัวอย่าง - อาจเป็น " รับชื่อพื้นที่เก็บข้อมูล Git จากที่ใดก็ได้ในพื้นที่เก็บข้อมูล Git นั้น " (ซึ่งขัดแย้งกับวิธีที่ฉันจินตนาการเก็บข้อมูลGit )) ฉันไม่เห็นข้อบ่งชี้ว่า / ควรทราบ URL
greybeard

1

วิธีการนี้ใช้git-remoteงานได้ดีสำหรับฉันสำหรับรีโมท HTTPS:

$ 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ไดเร็กทอรีของที่เก็บ currrent $gitdirมันเก็บเส้นทางใน

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

สิ่งนี้จะดำเนินการcat ${gitdir}/descriptionซึ่งจะพิมพ์เนื้อหาของที่.git/descriptionเก็บปัจจุบันของคุณ หากคุณตั้งชื่อพื้นที่เก็บข้อมูลของคุณอย่างถูกต้องมันจะพิมพ์ชื่อ มิฉะนั้นจะพิมพ์ออกมาUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

หากชื่อ repo ถูกต้องให้พิมพ์เนื้อหา

else

มิฉะนั้น...

echo "Unnamed repository!"

บอกผู้ใช้ว่า repo นั้นไม่มีชื่อ


มีการใช้บางสิ่งที่คล้ายกันในสคริปต์นี้


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'- ไม่จำเป็นต้องใส่เชลล์เข้าไปในนามแฝงคำสั่งเดียว
kostix

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

นอกจากนี้ฉันเพิ่งพบว่ามีข้อมูล repo อยู่ใน.gitไดเรกทอรี ดังนั้นคุณสามารถดูFETCH_HEADไฟล์ใน terminal เพื่อดูชื่อ repo:

ตัวอย่าง:

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 remote -v

เอกสารประกอบ: https://git-scm.com/docs/git-remote

จัดการชุดของที่เก็บ ("รีโมต") ที่มีสาขาที่คุณติดตาม -v - verbose เป็น verbose อีกเล็กน้อยและแสดง URL ระยะไกลหลังจากชื่อ หมายเหตุ: สิ่งนี้จะต้องอยู่ระหว่างคำสั่งรีโมตและคำสั่งย่อย


1
git remote -vกำลังส่งคืน URL อย่างน้อยหนึ่งรายการ สิ่งนี้จะตอบคำถามได้อย่างไร
Peter Mortensen

ตามที่ระบุไว้ก่อนหน้านี้จะส่งคืนเฉพาะ URL ... และจะคืนค่า 2 URL คั่นด้วยตัวแบ่งบรรทัดโดยมีตัวอักษรที่ไม่จำเป็นอยู่ตรงหน้า URL ดังนั้นมันจึงสร้างปัญหาโดยการรวมข้อมูลที่ไม่จำเป็นจากนั้นนำเสนอสองเส้นทางเพื่อค้นหาจากนั้นก็ยังไม่ได้รับชื่อของ repo
Andrew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.