【问题标题】:How can I determine the URL that a local Git repository was originally cloned from?如何确定最初克隆本地 Git 存储库的 URL?
【发布时间】:2011-05-04 14:48:21
【问题描述】:

几天前我从 GitHub 拉了一个项目。从那以后我发现 GitHub 上有几个 fork,而我忽略了我最初使用的是哪一个。如何确定我拉了哪些叉子?

【问题讨论】:

  • 使用 git 2.7(2015 年第四季度),git remote get-url origin 将成为可能。见my answer below
  • git remote get-url origin 对我不起作用——可能已弃用? git remote show origin 虽然有效。
  • git remote -v 给你很多信息,包括这个。
  • git remote get-url origin --push 工作正常,显然没有贬值,并提供了很好的简短信息(git remote show origin 可以非常详细)q.v。 git help remote.

标签: git github git-remote


【解决方案1】:

如果您只需要远程 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:

如果您想在脚本中使用该值,您将使用此答案中列出的第一个命令。

【讨论】:

  • 如果将 jgit 与 amazon-s3 一起使用,请使用 git config,如下所述。
  • 虽然与原始问题的目的无关,但请注意,如果尝试获取“推送 URL”并且为指定的远程输入了多个 URL,您将需要使用 @987654327 @(可以选择使用 @Casey 提供的 -n 标志),或 @Montaro 和 @rodel 建议的 git remote -v
  • 这是写入什么文件的?我以为.gitconfig 文件会有它,但我没有在我的文件中看到它。
  • @ayjay ´~/.gitconfig 对所有 git 存储库都是全局的,这里来自通常位于 .git/config 中的本地配置(但是对于 git-submodules,答案有点困难) .请注意,strace git config --get remote.origin.url 是您的朋友。
  • 但原始 URL 不一定是当前使用的遥控器的 URL。要显示实际使用的 URL,您将需要此解决方案:stackoverflow.com/a/40630957/1069083
【解决方案2】:

如果您希望这个用于脚本目的,您只能获取 URL

git config --get remote.origin.url

【讨论】:

  • 这是正确答案。如果远程 url 不再可用(git remote show origin 只显示“conq:存储库不存在。”),它会更快,甚至可以工作。
  • 由于配置选项url.<base>.insteadOf,这不是完全正确的答案。请参阅我的回答 - git 有一个用于此目的的命令。
  • @arcresu 酷,+1 给你!在我的辩护中,该命令直到 2011 年 3 月才被添加,并且直到 2012 年 9 月才被记录。
  • @Catskul Only --git-dir 是相关的(配置在 git 目录中,独立于工作树位置),它对我有用。你确定你指定了实际 .git 目录的路径,而不是它的父目录?
【解决方案3】:

你可以试试:

git remote -v

它将打印您所有遥控器的获取/推送 URL。

【讨论】:

  • @Montaro 完全正确,没有它,只会打印遥控器的名称(例如origin)。
【解决方案4】:

要得到答案:

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

这比读取配置好;参考man page for git-ls-remote

--get-url

考虑到扩展给定远程存储库的 URL 任何"url.<base>.insteadOf" 配置设置(请参阅git-config(1))和 退出而不与遥控器交谈。

正如@Jefromi 所指出的,此选项是在v1.7.5 中添加的,直到v1.7.12.2 (2012-09) 才记录在案。

【讨论】:

  • 好一个:这也将为以前的版本提供相同的功能> git remote -v| grep fetch|awk '{print $2}'
  • 我认为大多数其他答案更多的是关于 git 命令和关于 git 历史的展示。这是唯一不假设您的上游被称为 origin 的答案。
  • 这是旧remote get-url 选项的最直接替代。这是一个插入式替代品。
【解决方案5】:

使用 Git 2.7(2015 年 1 月 5 日发布),您可以使用 git remote 获得更一致的解决方案:

git remote get-url origin

git remote set-url origin <newurl>的漂亮吊坠)

参见Ben Boeckel (mathstuf)commit 96f78d3(2015 年 9 月 16 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit e437cbd,2015 年 10 月 5 日)

远程:添加 get-url 子命令

扩展insteadOfls-remote --url 的一部分,没有办法 扩展pushInsteadOf
添加一个get-url 子命令,以便能够同时查询以及获取所有已配置的 URL。

get-url:

检索远程的 URL。
insteadOfpushInsteadOf 的配置在此处展开​​。
默认情况下,仅列出第一个 URL。

  • 使用“--push”,查询推送 URL 而不是获取 URL。
  • 使用“--all”,将列出远程的所有 URL。

在 git 2.7 之前,你有:

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

【讨论】:

  • 5 年后发生了很多变化,现在这应该是公认的答案。但也可以添加 2.7 之前的语法。
【解决方案6】:

总结起来,至少有四种方式:

使用官方 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)

【讨论】:

  • 注意git config --get remote.origin.url 检索使用git remote add ...git remote set-url ... 设置的原始URL,而git ls-remote --get-url origin 检索实际用于访问远程的URL - 在存在的情况下可能会有所不同git config --global url.XXX.insteadOf YYY所以两个输出可能不同! 另请注意,git ls-remote --get-url(没有origin)不一定检索origin,而是显示跟踪的上游,因此它会失败,例如在分离的HEAD状态下.
【解决方案7】:

如果你没有操纵它,我想你可以在 .git/configremote["origin"] 下找到它。

【讨论】:

    【解决方案8】:

    对我来说,这是更简单的方法(少打字):

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

    实际上,我已将其放入名为 salias 中:

    git remote -v
    git status
    

    您可以将以下内容添加到您的个人资料中: alias s='git remote -v && git status'

    【讨论】:

      【解决方案9】:

      简答:

      $ 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,它不会获取远程头(AKA 分支)。你不需要那种信息,对吧?

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

      您可以将| grep -i fetch 应用于所有三个版本以仅显示提取 URL。

      如果您需要纯速度,请使用:

      $ git config --get remote.origin.url
      

      感谢@Jefromi 指出这一点。

      【讨论】:

        【解决方案10】:

        我永远记不住 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 command,它提供了有关远程和本地分支的更多详细信息。

        【讨论】:

        • 漂亮的别名,我喜欢它们与bash 命令的自然融合。在bashgit 之间切换时,我可以看到这会导致最少的心理摩擦。太棒了!
        【解决方案11】:

        我更喜欢这个,因为它更容易记住:

        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
        

        【讨论】:

          【解决方案12】:

          Git URL 将位于 Git 配置文件中。该值对应于键url

          对于 Mac 和 Linux,请使用以下命令:

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

          对于 Windows,在任何文本编辑器中打开以下文件并找到键 url 的值。

          project_dir/.git/config
          

          注意:即使您处于离线状态或远程 git 服务器已被关闭,这也将起作用。

          【讨论】:

          • 托管原始结帐的远程服务器被关闭后,这对我有用。所有其他尝试均失败:git remote get-url origin >> fatal: No such remote 'origin'git config --get remote.origin.url >>
          【解决方案13】:

          我基本上都用:

          git remote get-url origin
          

          它适用于 Windows 中的 Git Bash 命令控制台或 CMD 命令控制台。也就是说,它适用于 Git 2.x 版本。

          【讨论】:

            【解决方案14】:
            git config --list
            

            此命令将提供与您的存储库相关的所有信息。

            【讨论】:

              【解决方案15】:

              上游的远程可能不称为“源”,所以这里有一个变体:

              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
              

              【讨论】:

                【解决方案16】:

                获取origin的IP地址/主机名

                对于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 ":"
                

                【讨论】:

                • 对于ssh,这仅适用于没有~/.ssh/config 重写主机名或别名的情况。
                【解决方案17】:

                补充其他答案:如果遥控器由于某种原因已更改,因此不反映 原始 来源,则 reflog 中的第一个条目(即显示的最后一个条目)命令 git reflog) 应该指明 repo 最初克隆的位置。

                例如

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

                (请记住,reflog 可能会被清除,所以这不能保证有效。)

                【讨论】:

                  【解决方案18】:

                  使用git remote show origin,您必须位于项目目录中。但是,如果您想从其他任何地方确定 URL 你可以使用:

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

                  如果您经常需要此命令,您可以使用 MacOS 在 .bashrc.bash_profile 中定义别名。

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

                  所以你只需要在 Git 根文件夹中调用 giturl 就可以简单地获取它的 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) 在 Linux 上使用 Chrome 浏览器打开它。

                  【讨论】:

                    【解决方案19】:

                    一个简单的方法是打开.git/config文件:

                    cat .git/config
                    

                    编辑:

                    vim .git/config

                    nano .git/config

                    【讨论】:

                    • 这假定您使用的是 Linux(?)。
                    【解决方案20】:

                    您使用 SSH 克隆克隆了您的存储库。

                    git config --get remote.origin.url
                    git@gitlab.com:company/product/production.git
                    

                    但是你想获取http url在浏览器中打开或者分享:

                    git config --get remote.origin.url | sed -e 's/:/\//g'| sed -e 's/ssh\/\/\///g'| sed -e 's/git@/https:\/\//g'
                    
                    https://gitlab.com/company/product/production.git
                    

                    GitHub 或 GitLab 无关紧要。

                    【讨论】:

                    • 有用!但不适用于 https 网址。这是通用的,适用于git@...https://...git config --get remote.origin.url | sed -E 's/:([^\/])/\/\1/g' | sed -e 's/ssh\/\/\///g' | sed -e 's/git@/https:\/\//g'
                    【解决方案21】:

                    打印任意命名的远程获取 URL:

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

                    【讨论】:

                      【解决方案22】:

                      如果您不知道某个分支的上游远程名称,您可以首先通过检查当前分支所基于的上游分支名称来查找它。像这样使用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)
                      

                      现在应该注意的是,这不一定与克隆的源远程存储库相同。但在许多情况下,这就足够了。

                      【讨论】:

                        【解决方案23】:
                        #!/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
                        

                        【讨论】:

                          【解决方案24】:

                          仅获取远程 URL:

                          git config --get remote.origin.url
                          

                          要获取有关特定遥控器的更多详细信息,请使用

                          git remote show [remote-name] command
                          

                          查看远程网址

                          git remote show origin
                          

                          查看 .git 文件夹放置的位置

                          git config --get remote.origin.url
                          

                          【讨论】:

                            【解决方案25】:

                            只需在您放置 .git 文件夹的位置使用此命令即可

                            git config --get remote.origin.url

                            如果您已连接到网络

                            git remote show origin

                            它将向您显示最初克隆本地 Git 存储库的 URL。

                            希望有帮助

                            【讨论】:

                              【解决方案26】:
                              alias git-repo="git config --get remote.origin.url | sed -e 's/:/\//g'| sed -e 's/ssh\/\/\///g'| sed -e 's/git@/https:\/\//g'"
                              alias git-pr="git config --get remote.origin.url | sed -e 's/:/\//g'| sed -e 's/ssh\/\/\///g'| sed -e 's/git@/https:\/\//g' | sed 's/....$//' | sed -ne 's/$/\/pulls &/p'"
                              

                              将此表达式添加到主目录上的 .zshrc 或 .bashrcs

                              以后可以用like

                              git-repo
                              git-pr
                              

                              【讨论】:

                                猜你喜欢
                                • 2013-02-28
                                • 1970-01-01
                                • 2022-12-03
                                • 2021-09-18
                                • 2013-11-04
                                • 1970-01-01
                                • 2013-07-14
                                • 1970-01-01
                                • 2011-04-03
                                相关资源
                                最近更新 更多