Làm thế nào để bạn có được tên của kho lưu trữ Git trong một số kho lưu trữ Git?


144

Khi bạn đang làm việc trong một thư mục Git, làm thế nào bạn có thể nhận được tên kho lưu trữ Git trong một số kho lưu trữ Git? Có lệnh Git nào không?

# 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

Có vẻ như đây là những gì bạn đang theo đuổi. stackoverflow.com/questions / 4076239 / Mạnh
Max Sherman

Không, đó có lẽ không phải là điều anh ấy muốn. Điều này có thể là, mặc dù: stackoverflow.com/questions/957928/ Từ
Nevik Rehnel 30/03/13

nếu bạn sử dụng node.js, bạn có thể thử npmjs.com/package/git-repo-name
jonschlinkert

Câu trả lời:


153

Chà, nếu, đối với tên kho lưu trữ, bạn có nghĩa là tên thư mục gốc Git (tên chứa thư mục .git), bạn có thể chạy nó:

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

Phần này git rev-parse --show-toplevelcung cấp cho bạn đường dẫn đến thư mục đó và basenameloại bỏ phần đầu tiên của đường dẫn.


9
Như @mvp nói bên dưới, bạn có thể thay đổi tên của thư mục chứa .gitthư mục con, vì vậy không đúng "nếu, đối với tên kho lưu trữ, bạn có nghĩa là tên thư mục gốc git".
tắt

7
Lệnh này cung cấp cho bạn chính xác rằng: tên của thư mục ngay phía trên thư mục .git. Đó là một cách giải thích cho "tên của kho lưu trữ" và có vẻ như đó là cái OP đang tìm kiếm. Rõ ràng có những cách hiểu hợp lệ khác, như tên của kho lưu trữ nguồn gốc từ xa. Không có sự thật phổ quát trong trường hợp này và nó thực sự phụ thuộc vào những gì bạn muốn.
Fuad Saud

1
Không hoạt động trong windows 8.1 khi thư mục của tôi trông giống như "Dự án 1.1". Nó chỉ vang vọng "Dự án". Cộng với tên thư mục ở đây không nhất thiết phải liên quan đến tên repo của tôi, phải không?
Butussy Butkus

Câu hỏi bổ sung: làm thế nào để thêm chuỗi này thành một chuỗi trong chuỗi chuỗi như: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Như bạn có thể thấy dòng này sẽ không hoạt động vì sử dụng `` bên trong ``
sợ hãi 17/03/2016

1
Điều này không an toàn. Hãy thử cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevelvà nó sẽ trả lại cho bạn / var / www / html
sibaz

126

Nói chung, bạn không thể làm điều này. Git không quan tâm làm thế nào kho git của bạn được đặt tên. Ví dụ: bạn có thể đổi tên thư mục chứa kho lưu trữ của bạn (một .gitthư mục con) và git thậm chí sẽ không nhận thấy nó - mọi thứ sẽ tiếp tục hoạt động.

Tuy nhiên, nếu bạn nhân bản nó, bạn có thể sử dụng lệnh:

git remote show origin

để hiển thị nhiều thông tin về điều khiển từ xa gốc mà bạn đã sao chép kho lưu trữ của mình và nó sẽ chứa URL bản sao gốc.

Tuy nhiên, nếu bạn đã xóa liên kết đến điều khiển từ xa ban đầu bằng cách sử dụng git remote rm originhoặc nếu bạn đã tạo kho lưu trữ đó bằng cách sử dụng git init, thông tin đó đơn giản là không thể có được - nó không tồn tại ở bất cứ đâu.


2
Bạn luôn có thể lấy tên chi nhánh bằng cách sử dụng tốt, git branch:) (nhánh hoạt động sẽ được đánh dấu bằng dấu sao *).
mvp

95

Không cần liên hệ với kho lưu trữ để lấy tên và tên thư mục sẽ không nhất thiết phản ánh tên từ xa.

Tôi thấy đây là cách chính xác và hiệu quả nhất để có được tên kho lưu trữ hiện tại:

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

Điều này sẽ hoạt động kể từ Git 1.8.1.5. Trước đó, git-repo-configlệnh không dùng nữa sẽ hoạt động (sớm nhất là Git 1.7.5).


4
Đồng ý, đây là câu trả lời rõ ràng nhất (tôi đã từng có $ {PWD ## * /} nhưng như bạn nói, tên thư mục hiện tại có thể khác với nguồn gốc)
Vincent De Smet

vâng, tôi đã tìm kiếm điều này, đánh giá cao.! tên thư mục của tôi khác nhau;)
csomakk

Điều này cũng hoạt động: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

Trong git v2.7.0 + , một tiểu ban get-urlđã được giới thiệu để ra git-remotelệnh.

Vỏ POSIX:

basename $(git remote get-url origin)

PowerShell:

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

Tôi nhận được .gitở cuối chuỗi của mình bằng phương thức này, vì vậy tôi đã thêm một phần tách để loại bỏ nó:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Nếu bạn trim()def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
tình cờ

17

Các câu trả lời khác vẫn không hoạt động khi tên thư mục của bạn không tương ứng với tên kho lưu trữ từ xa (và nó có thể). Bạn có thể lấy tên thật của kho lưu trữ với nội dung như sau:

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

Về cơ bản, bạn gọi git remote show origin, lấy URL kho lưu trữ từ trường "Tìm nạp URL:" và regex nó để lấy phần có tên: https://github.com/dragn/ Simpl-vimrc .git


1
Vâng, điều này là ổn, nhưng điều này sẽ truy vấn từ xa để cập nhật. Nó là tốt hơn để sử dụng git remote show origin -nđể ngăn chặn điều đó.
Ryanmt

1
Chúng ta có thể cập nhật lệnh sed để hoạt động không khi url gốc không kết thúc bằng .git? vậy 'foo.git' trở thành 'foo', nhưng 'foo' cũng phù hợp? Tôi đoán chúng ta cần kết hợp không tham lam?
Arnout Engelen

@ArnoutEngelen Tôi nghĩ rằng điều đơn giản nhất để làm là (tùy chọn) dải .gitvới một cuộc gọi khác sed, tôi đã cập nhật mã trong câu trả lời. Bằng cách này, nó sẽ hoạt động, khi URL không kết thúc .git.
kéo

Có ý nghĩa! Tốt một!
Arnout Engelen

7
Công cụ đơn giản này sedhoạt động tốt hơn trên Mac OSX của tôi:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu 22/03/2016

6

Nếu bạn đang cố gắng để có được tên người dùng hoặc tên tổ chức VÀ tên dự án hoặc repo trên github, tôi đã có thể viết lệnh này hoạt động cho tôi ít nhất là tại địa phương.

 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

Đây là kết quả mong muốn như Vydialà tên tổ chức và gouramilà tên gói. Kết hợp chúng có thể giúp tạo thành User/Repođường dẫn hoàn chỉnh


5

Tôi nghĩ rằng đây là một cách tốt hơn để xác định rõ ràng một bản sao của một kho lưu trữ.

git config --get remote.origin.urlvà kiểm tra để đảm bảo rằng nguồn gốc phù hợp ssh://your/repo.


1
Trên thực tế một điều kiện mạnh mẽ hơn, đòi hỏi ít phân tích cú pháp. Có thể phải chỉ định tên url thay vì tên dự án, nhưng phải trả một mức giá nhỏ. Cách mà mọi người khác đang làm sẽ phá vỡ nếu ".git" xảy ra trong tên repo. Không thể, nhưng có thể.
Shane J

1
@ShaneJ bạn ngay đang và bạn thúc đẩy tôi viết câu trả lời của riêng tôi mà xử lý việc ".git" trong tên gốc repo từ xa: stackoverflow.com/a/58843794/2696867
animatedgif

5

Một chút muộn cho câu hỏi này, nhưng nếu bạn:

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

Bạn sẽ thấy url của kho lưu trữ sẽ bao gồm 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

Tên đầy đủ

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

Trong câu hỏi, gipcompany đề cập đến việc ở đâu đó sâu bên dưới hệ thống phân cấp thư mục. Mặc dù tôi không chắc anh ấy thực sự muốn gì (có một ví dụ - có thể là " lấy tên kho lưu trữ Git từ bất cứ nơi nào trong kho Git đó " (điều này mâu thuẫn với cách tôi tưởng tượng kho lưu trữ git)), tôi không thấy dấu hiệu nào cho thấy / URL nên được biết.
greybeard

1

Cách tiếp cận này sử dụng git-remotehiệu quả với tôi đối với điều khiển từ xa HTTPS:

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

Thí dụ


1

Đây là một hàm bash sẽ in tên kho lưu trữ (nếu nó đã được thiết lập đúng):

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

Giải trình:

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

Điều này thực thi git rev-parse --git-dir, trong đó in đường dẫn đầy đủ đến .gitthư mục của kho lưu trữ hiện tại. Nó lưu trữ đường dẫn trong $gitdir.

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

Điều này thực thi cat ${gitdir}/description, trong đó in nội dung của .git/descriptionkho lưu trữ hiện tại của bạn. Nếu bạn đã đặt tên đúng cho kho lưu trữ của mình, nó sẽ in tên. Nếu không, nó sẽ inUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Nếu repo được đặt tên chính xác, sau đó in nội dung.

else

Nếu không thì...

echo "Unnamed repository!"

Nói với người dùng rằng repo không được đặt tên.


Một cái gì đó tương tự được thực hiện trong kịch bản này .


1

Thật không may, có vẻ như Git không có lệnh như vậy được tích hợp. Nhưng bạn có thể dễ dàng tự thêm nó với bí danh Git và một số phép thuật vỏ.

Như được chỉ ra bởi câu trả lời này , bạn có thể sử dụng git rev-parse --show-toplevelđể hiển thị thư mục gốc của thư mục Git hiện tại của bạn.

Nếu bạn muốn sử dụng nó thường xuyên, có thể thuận tiện hơn để xác định nó là bí danh. Đối với điều này, được sử dụng git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Sau này, bạn có thể sử dụng git rootđể xem thư mục gốc của kho lưu trữ mà bạn hiện đang ở.

Nếu bạn muốn sử dụng một tên tiểu ban khác hơn root, chỉ cần thay thế phần thứ hai alias.roottrong lệnh trên bằng bất cứ thứ gì bạn muốn.

Để biết chi tiết về bí danh trong Git, xem thêm git configtrang người đàn ông .


2
git config --add alias.root 'rev-parse --show-toplevel'- không cần ném vỏ cho bí danh một lệnh.
kostix

1

Nếu bạn muốn toàn bộ tên kho lưu trữ GitHub ('tên đầy đủ') - người dùng / kho lưu trữ và bạn muốn thực hiện điều đó với Ruby ...

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

0

Đây là của tôi:

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

không tốt hơn những cái khác, nhưng tôi đã biến nó thành hàm bash để tôi có thể đặt tên từ xa nếu nó không phải là nguồn gốc.

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

Ngoài ra tôi chỉ thấy rằng có một số thông tin repo trong .gitthư mục. Vì vậy, bạn chỉ có thể xem FETCH_HEADtệp trong thiết bị đầu cuối để xem tên của repo:

Thí dụ:

cd your_project_folder/.git
more FETCH_HEAD

Đầu ra:

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

https://bitbucket.org/somebituser/some_repo.gitlà tên của kho lưu trữ của bạn


0

Cái này hoạt động khá tốt với git-2.18.2 và có thể được khởi chạy từ kho lưu trữ đích git bên ngoài:

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


-1

Bạn có thể sử dụng: git remote -v

Tài liệu: https://git-scm.com/docs/git-remote

Quản lý bộ kho ("điều khiển từ xa") có chi nhánh bạn theo dõi. -v --verbose Hãy dài dòng hơn một chút và hiển thị url từ xa sau tên. LƯU Ý: Điều này phải được đặt giữa từ xa và tiểu ban.


1
git remote -vchỉ trả về một hoặc nhiều URL. Làm thế nào là điều này trả lời câu hỏi?
Peter Mortensen

Như đã nêu trước đó, điều này chỉ trả về các URL ... và nó trả về 2 URL được phân tách bằng dấu ngắt dòng, với các ký tự không cần thiết trước URL. Vì nó tạo ra một vấn đề bằng cách bao gồm thông tin không cần thiết, sau đó trình bày hai đường dẫn để tìm kiếm, sau đó nó vẫn không nhận được tên của repo.
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.