【问题标题】:fatal: ambiguous argument 'origin': unknown revision or path not in the working tree致命:模棱两可的参数“起源”:未知的修订版或路径不在工作树中
【发布时间】:2017-12-19 04:30:58
【问题描述】:

我过去经常使用git diff origin

在不同的环境中它不起作用。我不知道为什么。

user@host> git diff origin
fatal: ambiguous argument 'origin': unknown revision or path 
       not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

状态:

user@host> git status
On branch master
nothing to commit, working directory clean

遥控器:

user@host> git remote -v
origin  https://example.com/repos/djangotools (fetch)
origin  https://example.com/repos/djangotools (push)

版本:

user@host> git --version
git version 2.7.4

使用“git 版本 1.8.1.4”git diff origin 有效。

顺便说一句如果我使用“git diff origin/master”,我会看到相同的错误消息

顺便说一句,我认为“/master”是多余的。合理的默认设置是将本地分支与远程站点上的相同分支进行比较。

【问题讨论】:

  • 在任何git diff 命令中都不会期望像origin 这样的遥控器。
  • @ElpieKay 可以,我用git version 1.8.1.4测试过
  • 我试过了。是的,它有效。如果当前分支是master,则git diff origin 似乎是git diff master origin/master 的缩写。如果当前分支没有远程跟踪分支,它应该不起作用。
  • kernel.org/pub/software/scm/git/docs/gitrevisions.html 所示,裸名origin 通常会通过第6 步解析,即通过解析origin/HEAD。 (但是,如果某个较早的步骤首先解决了它,您将获得前一步的解决方案。如果origin/HEAD 不存在或无效,您将获得您所看到的fatal。)这不注意当前分支的上游设置:如果您想对此进行比较,请使用@{u}。你可能会说 Git 使用了疯狂的默认值。 :-)

标签: git


【解决方案1】:

git diff 命令通常需要一个或多个提交哈希来生成您的差异。您似乎在提供遥控器的名称。

如果您有一个名为 origin 的分支,如果您将 origin 提供给 diff 命令,则会使用分支顶端的提交哈希,但目前(没有相应的分支)该命令将产生错误你看到了。可能是您之前使用过一个名为 origin 的分支。

如果您想查看本地分支和远程分支之间的差异,另一种选择是:

git diff origin/&lt;branchname&gt;

git diff &lt;branchname&gt; origin/&lt;branchname&gt;

Or other documented variants.

编辑:进一步阅读后,我意识到我有点错误,git diff origin 是针对指定遥控器头部进行差异化的简写,所以git diff origin = git diff origin/HEAD (@987654322 @,Why is "origin/HEAD" shown when running "git branch -r"?)

听起来您的来源没有 HEAD,在我的情况下,这是因为我的遥控器是一个从未设置过 HEAD 的裸存储库。

运行git branch -r 将显示是否设置了origin/HEAD,如果设置了,它指向哪个分支(例如origin/HEAD -&gt; origin/&lt;branchname&gt;)。

【讨论】:

  • 非常感谢。是的,git branch -r 在一个仓库中是空的,而在另一个仓库中不是空的。这就是为什么 git diff origin 在一个仓库中工作而不在另一个仓库中工作的原因。
  • &lt;branchname&gt; 这里被替换为您的特定命名分支。
【解决方案2】:

我遇到了同样的情况,git diff origingit diff origin master等命令产生了问题中报告的错误,即Fatal: ambiguous argument...

为了解决这个问题,我运行了命令

git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master

设置 refs/remotes/origin/HEAD 指向 origin/master 分支。

在运行此命令之前,git branch -a 的输出为:

* master
  remotes/origin/master

运行命令后,错误不再出现,git branch -a 的输出为:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

(其他答案已经确定错误的来源是 HEAD 没有设置为原点。但我认为提供一个可用于修复相关错误的命令会有所帮助,尽管这对某些人来说可能很明显用户。)


附加信息:

对于任何倾向于尝试并在设置和取消设置 refs/remotes/origin/HEAD 之间来回切换的人,这里有一些示例。

要取消设置:
git remote set-head origin --delete

设置:
(除此答案开头显示的方式外,还有其他方式)
git remote set-head origin master 明确设置原点/头部

git remote set-head origin --auto 查询远程并自动将 origin/HEAD 设置为远程的当前分支。

参考文献:

  • 这个SO Answer
  • SO Comment 及其相关答案
  • git remote --help 见机头说明
  • git symbolic-ref --help

【讨论】:

    【解决方案3】:

    对于那些在 CI/CD 上遇到此错误的人,在运行 pip install pyflakes diff-cover 后,在我的 GitHub Actions CI/CD 工作流中添加以下行对我有用:

    git fetch origin master:refs/remotes/origin/master

    这是来自 diff-cover github repo 的解决方案的 sn-p:

    解决方案:diff-cover 匹配覆盖率 XML 报告中的源文件 与 git diff 中的源文件。出于这个原因,这很重要 文件的相对路径匹配。如果您正在使用 coverage.py 生成覆盖 XML 报告,然后确保你 从同一个工作目录运行 diff-cover。

    我在下面的链接中找到了解决方案。这是一个记录在案的diff-cover 错误。

    https://diff-cover.readthedocs.io/en/latest//README.html https://github.com/Bachmann1234/diff_cover/blob/master/README.rst

    希望这会有所帮助:-)。

    【讨论】:

      【解决方案4】:

      有时事情可能会更简单。我带着确切的问题来到这里并尝试了所有建议。但后来发现问题只是本地文件路径不同,我在不同的文件夹中。 :-)

      例如 -

      ~/myproject/mygitrepo/app/$ git diff app/TestFile.txt

      应该是

      ~/myproject/mygitrepo/app/$ git diff TestFile.txt

      【讨论】:

        【解决方案5】:

        如果origin 指向磁盘上的裸存储库,则如果该目录已被移动(即使您更新了工作副本的远程),也会发生此错误。例如

        $ mv /path/to/origin /somewhere/else
        $ git remote set-url origin /somewhere/else
        $ git diff origin/master
        fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
        

        从新的origin 拉一次即可解决问题:

        $ git stash
        $ git pull origin master
        $ git stash pop
        

        【讨论】:

          【解决方案6】:

          这对我有用 将 REL_PATH_TO_FILE 替换为要删除的文件的相对路径 Removing sensitive data from a repository 文档说完整路径-但这对我来说是错误的-所以我尝试了 rel path 并且它起作用了。

          <from the repo dir>git filter-branch --force --index-filter "git rm --cached --ignore-unmatch REL_PATH_TO_FILE" --prune-empty --tag-name-filter cat -- --all
          

          【讨论】:

            【解决方案7】:
            • 删除 opt/homebrew 文件夹 cd /opt, sudo rm -rf homebrew

            • 安装自制软件: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

            如果您是第一次安装自制软件并遇到此错误,那么在第二次尝试时,请先清除 /opt/homebrew 文件夹。

            【讨论】:

            • 我的这个问题与 Homebrew 无关。它发生在 Ubuntu Linux 上。
            猜你喜欢
            • 2016-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-29
            • 2021-09-15
            • 2023-03-25
            • 2020-07-24
            相关资源
            最近更新 更多