致命的:模糊的论证'起源':未知的修订或路径不在工作树中

时间:2017-07-14 07:05:13

标签: git

过去我经常使用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 version 1.8.1.4”git diff origin有效。

BTW 如果我使用“git diff origin / master”,我会看到相同的错误信息

BTW2,我认为“/ master”是多余的。理所当然的默认设置是将本地分支与远程站点上的同一分支进行比较。

6 个答案:

答案 0 :(得分:23)

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

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

的情况

另一种方法是,如果您尝试查看本地分支与远程分支之间的差异,则可能会出现以下情况:

git diff origin/<branchname>

git diff <branchname> origin/<branchname>

Or other documented variants

编辑:进一步阅读后,我发现我有点错误,git diff origin是对指定遥控器头部进行差异的简写,因此git diff origin = git diff origin/HEADcompare local git branch with remote branch?Why is "origin/HEAD" shown when running "git branch -r"?

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

正在运行git branch -r会显示是否设置了origin/HEAD,如果设置了{1}},它会指向哪个分支(例如origin/HEAD -> origin/<branchname>)。

答案 1 :(得分:7)

我遇到了同样的情况,例如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。但是我认为提供一个可用于修复有问题的错误的命令会有所帮助,尽管对于某些人来说可能很明显用户。)


其他信息:

对于喜欢尝试并在设置和取消设置ref / 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

答案 2 :(得分:6)

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

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

这是diff-cover github存储库中的解决方案的片段:

解决方案:diff-cover匹配coverage XML报告中的源文件 在git diff中包含源文件。因此,重要的是 文件的相对路径匹配。如果您正在使用 coverage.py以生成coverage XML报告,然后确保您 从同一工作目录运行diff-cover。

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

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

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

答案 3 :(得分:2)

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

例如-

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

应该是

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

答案 4 :(得分:1)

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

<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

答案 5 :(得分:1)

如果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