Как я могу определить URL, с которого изначально был клонирован локальный репозиторий Git?


4098

Я вытащил проект из GitHub несколько дней назад. С тех пор я обнаружил, что на GitHub есть несколько вилок, и я забыл отметить, какой из них я взял изначально. Как я могу определить, какие из тех вилок я вытащил?


163
С git 2.7 (4 квартал 2015 года) git remote get-url originбудет возможно. Смотрите мой ответ ниже
VonC


21
git remote get-url originу меня не работает - возможно, не рекомендуется? git remote show originработал хотя.
Клик

47
git remote -vдать вам много информации, в том числе это.
Торбьерн Равн Андерсен

git remote get-url origin --pushработает нормально, очевидно, не обесценивается и предоставляет хорошую краткую информацию ( git remote show originможет быть очень многословной) qv git help remote.
NeilG

Ответы:


5761

Если вам нужен только удаленный URL-адрес или вы не подключены к сети, которая может достичь удаленного репо:

git config --get remote.origin.url

Если вам требуется полный вывод, и вы находитесь в сети, которая может достичь удаленного репо, где находится источник:

git remote show origin

При использовании git clone(из GitHub или любого другого репозитория исходного кода) именем по умолчанию для источника клона является «origin». Используя git remote showотобразит информацию об этом удаленном имени. Первые несколько строк должны показать:

C:\Users\jaredpar\VsVim> git remote show origin
* remote origin
  Fetch URL: git@github.com:jaredpar/VsVim.git
  Push  URL: git@github.com:jaredpar/VsVim.git
  HEAD branch: master
  Remote branches:

Если вы хотите использовать значение в сценарии, вы должны использовать первую команду, указанную в этом ответе.


2
Вместо этого используйте git config, как описано ниже, если используете jgit с amazon-s3.
Баррику

6
Хотя это не относится к цели исходного вопроса, имейте в виду, что если вы пытаетесь получить «Push URL» и ввести несколько URL-адресов для указанного удаленного, вам нужно будет либо использовать git remote show origin(опционально с флагом -n, предоставленным @ Кейси), или с git remote -vпредложением @Montaro и @rodel.
Amazingant

В какой файл это записано? Я думал, что у .gitconfigфайла будет это, но я не видел это в моем.
ayjay

1
@ayjay ´~/.gitconfigявляется глобальным для всех gitрепозиториев, здесь это происходит из локальной конфигурации, которая обычно находится .git/config(однако для git-подмодулей ответ немного сложнее). Обратите внимание, что strace git config --get remote.origin.urlэто ваш друг.
Тино

1
Но исходный URL-адрес не обязательно должен быть URL-адресом используемого в настоящее время пульта дистанционного управления. Чтобы отобразить фактический используемый URL, вам понадобится следующее решение: stackoverflow.com/a/40630957/1069083
rubo77

620

Если вы хотите использовать это в сценариях, вы можете получить только URL с

git config --get remote.origin.url

38
Это правильный ответ. Это намного быстрее и даже работает, если удаленный URL больше не доступен ( git remote show originпросто показывает «conq: repository not Существует.»).
apfelbox

5
Это не совсем правильный ответ из-за опции конфигурации url.<base>.insteadOf. Смотрите мой ответ - у git есть команда для этой цели.
Карл Састер

2
@arcresu Круто, +1 тебе! В мою защиту, эта команда не была добавлена ​​до марта 2011 года, и она не была задокументирована до сентября 2012 года.
Каскабель

1
@Catskul Только --git-dir является релевантным (конфигурация находится в git dir, независимо от местоположения рабочего дерева), и это работает для меня. Вы уверены, что указали путь к фактическому каталогу .git, а не к его родительскому каталогу?
Каскабель

553

Ты можешь попробовать:

git remote -v

Он напечатает URL-адреса всех извлеченных / отправленных пультов.


255

Чтобы получить ответ:

git ls-remote --get-url [REMOTE]

Это лучше, чем читать конфигурацию; обратитесь к странице справочника дляgit-ls-remote :

--get-URL

Разверните URL-адрес данного удаленного репозитория с учетом любого "url.<base>.insteadOf"параметра конфигурации (см. git-config(1)) И выйдите, не обращаясь к удаленному.

Как отмечает @Jefromi, эта опция была добавлена ​​в v1.7.5 и не документирована до v1.7.12.2 (2012-09).


2
хороший: это также обеспечило бы то же самое для предыдущих версий> git remote -v | grep fetch | awk '{print $ 2}'
ravi.zombie

1
Я думаю, что большинство других ответов - это скорее шоу-и-рассказ о командах git и описание истории git. Это единственный ответ, который не предполагает, что ваш апстрим называется origin.
Майк Д

Это самая прямая замена старого remote get-urlварианта. Это замена замены.
Клаату фон

111

С Git 2.7 (выпуск 5 января 2015 г.) у вас есть более согласованное решение, использующее git remote:

git remote get-url origin

(милая подвеска git remote set-url origin <newurl>)

Смотрите коммит 96f78d3 (16 сентября 2015 г.) Бена Беккеля ( mathstuf) .
(Слиты Junio C Hamano - gitster- в фиксации e437cbd , 5 октября 2015) :

remote: добавить подкоманду get-url

Расширение insteadOfявляется частью, ls-remote --urlи нет никакого способа также расширяться pushInsteadOf.
Добавьте get-urlподкоманду, чтобы иметь возможность запрашивать оба, а также способ получить все настроенные URL-адреса.

get-url:

Получает URL-адреса для удаленного.
Конфигурации для insteadOfи pushInsteadOfрасширены здесь.
По умолчанию указан только первый URL.

  • С помощью ' --push' push-URL-адреса запрашиваются, а не выбирают URL-адреса.
  • С ' --all' будут перечислены все URL для удаленного.

До git 2.7 у вас было:

 git config --get remote.[REMOTE].url
 git ls-remote --get-url [REMOTE]
 git remote show [REMOTE]

4
Через 5 лет многое изменилось, и теперь это должен быть принятый ответ. Но, возможно, также добавьте синтаксис pre-2.7.
MSP

58

Подводя итог, можно выделить как минимум четыре способа:

(Следующее было опробовано для официального репозитория Linux)

Наименее информация:

$ git config --get remote.origin.url
https://github.com/torvalds/linux.git

а также

$ git ls-remote --get-url
https://github.com/torvalds/linux.git

Больше информации:

$ git remote -v
origin    https://github.com/torvalds/linux.git (fetch)
origin    https://github.com/torvalds/linux.git (push)

Еще больше информации:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/torvalds/linux.git
  Push  URL: https://github.com/torvalds/linux.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

4
Note git config --get remote.origin.urlвозвращает исходный URL-адрес, который был установлен с помощью git remote add ...или git remote set-url ...во время git ls-remote --get-url originполучения URL-адреса, который фактически используется для доступа к удаленному устройству - который может отличаться при наличии git config --global url.XXX.insteadOf YYY. Так что оба выхода могут отличаться! Также обратите внимание, что git ls-remote --get-url(без origin) не обязательно извлекает origin, вместо этого он показывает отслеженный восходящий поток, поэтому он потерпит неудачу, например, в отключенном состоянии HEAD.
Тино


22

Короткий ответ:

$ git remote show -n origin

или альтернатива для простых быстрых сценариев:

$ git config --get remote.origin.url

Некоторая информация:

  1. $ git remote -vбудет печатать все пульты (не то, что вы хотите). Вы хотите происхождение правильно?
  2. $ git remote show originнамного лучше, показывает только, originно занимает слишком много времени (проверено на git версии 1.8.1.msysgit.1).

Я закончил с:, $ git remote show -n originкоторый, кажется, самый быстрый. С -nнего не будут извлекать удаленные головки (ветви АКА). Вам не нужна такая информация, верно?

http://www.kernel.org/pub//software/scm/git/docs/git-remote.html

Вы можете обратиться | grep -i fetchко всем трем версиям, чтобы отобразить только URL для получения.

Если вам нужна чистая скорость, используйте:

$ git config --get remote.origin.url

Спасибо @Jefromi за указание на это.


22

Для меня это более простой способ (меньше печатать):

$ git remote -v
origin    https://github.com/torvalds/linux.git (fetch)
origin    https://github.com/torvalds/linux.git (push)

на самом деле, у меня есть то, что aliasназывается s:

git remote -v
git status

Вы можете добавить в свой профиль с помощью: alias s='git remote -v && git status'


17

Я никогда не могу вспомнить все параметры команд Git, поэтому я просто добавляю псевдоним в ~/.gitconfigфайл, который имеет больше смысла для меня, чтобы я мог его запомнить, и это приводит к меньшему количеству ввода:

[alias]
url = ls-remote --get-url

После перезагрузки терминала вы можете просто набрать:

> git url

Вот еще несколько моих часто используемых:

[alias]
cd = checkout
ls = branch
lsr = branch --remote
lst = describe --tags

Я также настоятельно рекомендую git-extras, которая имеет git info команду, которая предоставляет гораздо более подробную информацию об удаленных и локальных ветвях.


Мне это очень нравится!
Алфи

15

URL Git будет внутри конфигурационного файла Git. Значение соответствует ключу url.

Для Mac и Linux используйте команды ниже:

 cd project_dir
 cat .git/config | grep url | awk '{print $3}'

Для Windows откройте файл ниже в любом текстовом редакторе и найдите значение для ключа url.

project_dir/.git/config

Примечание: это будет работать, даже если вы находитесь в автономном режиме или удаленный git-сервер отключен.


1
Это то, что сработало для меня, когда удаленный сервер, на котором размещалась исходная проверка, был снят. Все остальные попытки не увенчались успехом: git remote get-url origin >> fatal: No such remote 'origin',git config --get remote.origin.url >>
jxramos

14

Я в основном использую:

git remote get-url origin

Он работает для командной консоли Git Bash или командной консоли CMD в Windows. Тем не менее, он работает с версией 2.x Git.



10

Пульт ДУ восходящего потока не может называться «источником», так что вот вариант:

remote=$(git config --get branch.master.remote)
url=$(git config --get remote.$remote.url)
basename=$(basename "$url" .git)
echo $basename

Или:

basename $(git config --get remote.$(git config --get branch.master.remote).url) .git

Для более полезных переменных есть:

$ git config -l

9

Чтобы получить IP-адрес / имя хоста origin

Для ssh://репозиториев:

git ls-remote --get-url origin | cut -f 2 -d @ | cut -f 1 -d "/"

Для git://репозиториев:

git ls-remote --get-url origin | cut -f 2 -d @ | cut -f 1 -d ":"

4
Для sshэтого работает только при отсутствии ~/.ssh/configкоторого переписывает имя хоста или псевдоним.
Тино

9

В дополнение к другим ответам: Если пульт дистанционного управления по какой-то причине был изменен и поэтому не отражает исходное происхождение, самая первая запись в журнале операций (т. Е. Последняя запись, отображаемая командой git reflog) должна указывать, где хранилище было первоначально клонировано. от.

например

$ git reflog | tail -n 1
f34be46 HEAD@{0}: clone: from https://github.com/git/git
$

(Имейте в виду, что reflog может быть очищен, так что это не гарантируется).


1
Вероятно, это единственный реальный способ получить «оригинальный» пульт, если он был изменен.
Джастин Омс

8

С git remote show originвами должно быть в каталоге проектов. Но если вы хотите определить URL-адреса откуда угодно, вы можете использовать:

cat <path2project>/.git/config | grep url

Если вам часто понадобится эта команда, вы можете определить псевдоним в вашем MacOS .bashrcили в .bash_profileMacOS.

alias giturl='cat ./.git/config | grep url'

Так что вам просто нужно позвонить giturlв корневую папку Git, чтобы просто получить ее URL.


Если вы расширите этот псевдоним, как это

alias giturl='cat .git/config | grep -i url | cut -d'=' -f 2'

вы получаете только простой URL без предшествующего

"URL ="

в

url = http://example.com/repo.git

вы получаете больше возможностей в его использовании:

пример

На Mac вы можете позвонить, open $(giturl)чтобы открыть URL в стандартном браузере.

Или chrome $(giturl)открыть его с помощью браузера Chrome в Linux.



7

Распечатать произвольно названные URL удаленной загрузки:

git remote -v | grep fetch | awk '{print $2}'

6

Если вы не знаете имя вышестоящего пульта для ветви, вы можете сначала найти его, проверив имя вышестоящей ветви, на котором построена текущая ветка. Используйте git rev-parseкак это:

git rev-parse --symbolic-full-name --abbrev-ref @{upstream}

Это показывает, что восходящая ветвь, которая была источником для текущей ветки. Это может быть проанализировано, чтобы получить удаленное имя как это:

git rev-parse --symbolic-full-name --abbrev-ref @{upstream} | cut -d / -f 1

Теперь возьмите это и передайте по конвейеру, git ls-remoteи вы получите URL-адрес удаленного вышестоящего узла, являющегося источником текущей ветви:

git ls-remote --get-url \
  $(git rev-parse --symbolic-full-name --abbrev-ref @{upstream} | cut -d / -f 1)

Теперь следует отметить, что это не обязательно то же самое, что исходный удаленный репозиторий, из которого был клонирован. Однако во многих случаях этого будет достаточно.


5
#!/bin/bash

git-remote-url() {
 local rmt=$1; shift || { printf "Usage: git-remote-url [REMOTE]\n" >&2; return 1; }
 local url

 if ! git config --get remote.${rmt}.url &>/dev/null; then
  printf "%s\n" "Error: not a valid remote name" && return 1
  # Verify remote using 'git remote -v' command
 fi

 url=`git config --get remote.${rmt}.url`

 # Parse remote if local clone used SSH checkout
 [[ "$url" == git@* ]] \
 && { url="https://github.com/${url##*:}" >&2; }; \
 { url="${url%%.git}" >&2; };

 printf "%s\n" "$url"
}

Применение:

# Either launch a new terminal and copy `git-remote-url` into the current shell process, 
# or create a shell script and add it to the PATH to enable command invocation with bash.

# Create a local clone of your repo with SSH, or HTTPS
git clone git@github.com:your-username/your-repository.git
cd your-repository

git-remote-url origin

Вывод:

https://github.com/your-username/your-repository

5

Я предпочитаю этот, так как его легче запомнить:

git config -l

Он перечислит всю полезную информацию, такую ​​как:

user.name=Your Name
user.email=your.name@notexisting.com
core.autocrlf=input
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=https://github.com/mapstruct/mapstruct-examples
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

1

легко просто используйте эту команду, где вы поместили папку .git

git config --get remote.origin.url

если вы подключены к сети

git remote show origin

он покажет вам URL, с которого изначально был клонирован локальный репозиторий Git.

надеюсь, это поможет

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.