Git diff command fails for two dot comparison. Error: "fatal: ambiguous argument"
Git diff command fails for two dot comparison. Error: "fatal: ambiguous argument"
我正在使用以下命令使用两个点方法获取两个分支之间的差异。
git diff master..hotfix_master
在 gitlab 管道中,使用相同的命令,它失败了
> $ git diff hotfix_master..master fatal: ambiguous argument
> 'hotfix_master..master': unknown revision or path not in the working
> tree. Use '--' to separate paths from revisions, like this: 'git
> <command> [<revision>...] -- [<file>...]'
但是在本地笔记本电脑上,它可以工作。
我根本无法理解,这是什么问题。
我需要在某处使用转义字符吗?
请推荐
编辑 1:
即使在 origin
之后,它也不起作用。
$ git diff origin/hotfix_master..origin/master
fatal: ambiguous argument 'origin/hotfix_master..origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
编辑:2
$ pwd
/builds/irfanjs1/blank-proj
$ ls -al
total 28
drwxrwxrwx 3 root root 4096 Dec 13 15:09 .
drwxrwxrwx 4 root root 4096 Dec 13 15:09 ..
drwxrwxrwx 6 root root 4096 Dec 13 15:09 .git
-rw-rw-rw- 1 root root 445 Dec 13 15:09 .gitlab-ci.yml
-rw-rw-rw- 1 root root 7583 Dec 13 15:09 README.md
-rw-rw-rw- 1 root root 13 Dec 13 15:08 a.txt
$ dir
README.md a.txt
$ git diff origin/hotfix_master..origin/master
fatal: ambiguous argument 'origin/hotfix_master..origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
编辑 3
$ pwd
/builds/irfanjs1/blank-proj
$ ls -al
total 28
drwxrwxrwx 3 root root 4096 Dec 13 15:55 .
drwxrwxrwx 4 root root 4096 Dec 13 15:54 ..
drwxrwxrwx 6 root root 4096 Dec 13 15:55 .git
-rw-rw-rw- 1 root root 494 Dec 13 15:55 .gitlab-ci.yml
-rw-rw-rw- 1 root root 7583 Dec 13 15:55 README.md
-rw-rw-rw- 1 root root 13 Dec 13 15:54 a.txt
-rw-rw-rw- 1 root root 0 Dec 13 15:55 b.txt
$ dir
README.md a.txt b.txt
$ git branch
* (HEAD detached at 486173f)
$ git branch -r
origin/master
$ git diff origin/hotfix_master..origin/master
fatal: ambiguous argument 'origin/hotfix_master..origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
编辑 4
$ dir
README.md a.txt b.txt
$ git branch
* (HEAD detached at 87eb7a5)
$ git branch -r
origin/master
$ git fetch
From https://gitlab.com/irfanjs1/blank-proj
* [new branch] hotfix_master -> origin/hotfix_master
* [new branch] main -> origin/main
$ git diff origin/hotfix_master...origin/master
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ddf5df3..5b149d0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,6 +25,9 @@ merge-to-master:
- "pwd"
- "ls -al"
- "dir"
- - "git diff origin/hotfix_master..origin/master"
+ - "git branch"
+ - "git branch -r"
+ - "git fetch"
+ - "git diff origin/hotfix_master...origin/master"
报错有几种情况。
他们是:
git diff
命令是 运行 来自被 git 忽略的目录:
git diff
命令是 运行 来自新创建的目录,尚未添加到 git(未暂存):
对于不存在的分支,命令是运行:
对于第一种和第二种情况,解决方案就是退出您忽略的目录并运行在父文件夹中执行 git 命令。
对于第三种情况,只需确保分支在运行对它们进行差异化之前存在。也不要忘记在比较远程分支之前执行 git fetch
。
TL;DR
将您的 Git“深度”设置为零;参见 the documentation。
长
你的问题的关键在这里:
in gitlab pipeline
虽然没有足够的文档,但您无法提前知道这一点。 (我也在你的问题中添加了 gitlab-ci 标签,因为管道是 CI 系统的一部分。)这是你需要知道的:
CI 系统通常在原始存储库的 克隆 上运行。 (由于各种原因,他们不能直接使用原始的虚拟主机站点存储库。)
CI 系统尽可能节省时间和 space。
在 Git 中,一种在克隆中节省时间和 space 的方法是制作一个 浅克隆 。这可能也可能不使用 分离的 HEAD 模式(您的特定系统似乎会这样做)。
Git中的浅克隆默认也是单分支克隆.
这一切归结为你有两个问题:
您的存储库中只有一个 提交,在您的 CI 管道中。这使得无法将您的一次提交与任何其他提交进行比较。
您的资料库中只有一个可靠的名称,即HEAD
。这使得无法请求任何其他提交。
所以你不能 运行 这个 git diff
因为:
- 您不能通过(分支)名称请求提交,因为这些名称中的一个或多个不存在;
- 即使可以,您也没有其他提交。
这两个问题的简单解决方案是覆盖 CI 系统的浅层和单分支克隆——Git实验室并不孤单——当他们克隆 Git 存储库。在每个 CI 系统中,如何 执行此操作的具体细节各不相同。在 Git 实验室中,它 varies by GitLab version。不过,将“深度”设为零表示 进行完整克隆 .
是相当普遍的
请注意,您(现在,正确地)将需要使用 origin/
名称,因为完整克隆复制所有提交但 重命名 原始存储库的所有分支远程跟踪名称的名称。 git clone
操作使您处于具有 no 分支的克隆中,除非最后的克隆步骤是创建并签出一个分支。 (正如我上面提到的,有时最后一步是检查一个 分离的 HEAD,在这种情况下你实际上没有分支。你也可以让 git clone
跳过完全是最后一步,没有分支,尽管可能无法从 CI 管道执行此操作:详细信息将取决于 CI 系统。)
我正在使用以下命令使用两个点方法获取两个分支之间的差异。
git diff master..hotfix_master
在 gitlab 管道中,使用相同的命令,它失败了
> $ git diff hotfix_master..master fatal: ambiguous argument
> 'hotfix_master..master': unknown revision or path not in the working
> tree. Use '--' to separate paths from revisions, like this: 'git
> <command> [<revision>...] -- [<file>...]'
但是在本地笔记本电脑上,它可以工作。
我根本无法理解,这是什么问题。
我需要在某处使用转义字符吗?
请推荐
编辑 1:
即使在 origin
之后,它也不起作用。
$ git diff origin/hotfix_master..origin/master
fatal: ambiguous argument 'origin/hotfix_master..origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
编辑:2
$ pwd
/builds/irfanjs1/blank-proj
$ ls -al
total 28
drwxrwxrwx 3 root root 4096 Dec 13 15:09 .
drwxrwxrwx 4 root root 4096 Dec 13 15:09 ..
drwxrwxrwx 6 root root 4096 Dec 13 15:09 .git
-rw-rw-rw- 1 root root 445 Dec 13 15:09 .gitlab-ci.yml
-rw-rw-rw- 1 root root 7583 Dec 13 15:09 README.md
-rw-rw-rw- 1 root root 13 Dec 13 15:08 a.txt
$ dir
README.md a.txt
$ git diff origin/hotfix_master..origin/master
fatal: ambiguous argument 'origin/hotfix_master..origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
编辑 3
$ pwd
/builds/irfanjs1/blank-proj
$ ls -al
total 28
drwxrwxrwx 3 root root 4096 Dec 13 15:55 .
drwxrwxrwx 4 root root 4096 Dec 13 15:54 ..
drwxrwxrwx 6 root root 4096 Dec 13 15:55 .git
-rw-rw-rw- 1 root root 494 Dec 13 15:55 .gitlab-ci.yml
-rw-rw-rw- 1 root root 7583 Dec 13 15:55 README.md
-rw-rw-rw- 1 root root 13 Dec 13 15:54 a.txt
-rw-rw-rw- 1 root root 0 Dec 13 15:55 b.txt
$ dir
README.md a.txt b.txt
$ git branch
* (HEAD detached at 486173f)
$ git branch -r
origin/master
$ git diff origin/hotfix_master..origin/master
fatal: ambiguous argument 'origin/hotfix_master..origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
编辑 4
$ dir
README.md a.txt b.txt
$ git branch
* (HEAD detached at 87eb7a5)
$ git branch -r
origin/master
$ git fetch
From https://gitlab.com/irfanjs1/blank-proj
* [new branch] hotfix_master -> origin/hotfix_master
* [new branch] main -> origin/main
$ git diff origin/hotfix_master...origin/master
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ddf5df3..5b149d0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,6 +25,9 @@ merge-to-master:
- "pwd"
- "ls -al"
- "dir"
- - "git diff origin/hotfix_master..origin/master"
+ - "git branch"
+ - "git branch -r"
+ - "git fetch"
+ - "git diff origin/hotfix_master...origin/master"
报错有几种情况。
他们是:
git diff
命令是 运行 来自被 git 忽略的目录:git diff
命令是 运行 来自新创建的目录,尚未添加到 git(未暂存):对于不存在的分支,命令是运行:
对于第一种和第二种情况,解决方案就是退出您忽略的目录并运行在父文件夹中执行 git 命令。
对于第三种情况,只需确保分支在运行对它们进行差异化之前存在。也不要忘记在比较远程分支之前执行 git fetch
。
TL;DR
将您的 Git“深度”设置为零;参见 the documentation。
长
你的问题的关键在这里:
in gitlab pipeline
虽然没有足够的文档,但您无法提前知道这一点。 (我也在你的问题中添加了 gitlab-ci 标签,因为管道是 CI 系统的一部分。)这是你需要知道的:
CI 系统通常在原始存储库的 克隆 上运行。 (由于各种原因,他们不能直接使用原始的虚拟主机站点存储库。)
CI 系统尽可能节省时间和 space。
在 Git 中,一种在克隆中节省时间和 space 的方法是制作一个 浅克隆 。这可能也可能不使用 分离的 HEAD 模式(您的特定系统似乎会这样做)。
Git中的浅克隆默认也是单分支克隆.
这一切归结为你有两个问题:
您的存储库中只有一个 提交,在您的 CI 管道中。这使得无法将您的一次提交与任何其他提交进行比较。
您的资料库中只有一个可靠的名称,即
HEAD
。这使得无法请求任何其他提交。
所以你不能 运行 这个 git diff
因为:
- 您不能通过(分支)名称请求提交,因为这些名称中的一个或多个不存在;
- 即使可以,您也没有其他提交。
这两个问题的简单解决方案是覆盖 CI 系统的浅层和单分支克隆——Git实验室并不孤单——当他们克隆 Git 存储库。在每个 CI 系统中,如何 执行此操作的具体细节各不相同。在 Git 实验室中,它 varies by GitLab version。不过,将“深度”设为零表示 进行完整克隆 .
是相当普遍的请注意,您(现在,正确地)将需要使用 origin/
名称,因为完整克隆复制所有提交但 重命名 原始存储库的所有分支远程跟踪名称的名称。 git clone
操作使您处于具有 no 分支的克隆中,除非最后的克隆步骤是创建并签出一个分支。 (正如我上面提到的,有时最后一步是检查一个 分离的 HEAD,在这种情况下你实际上没有分支。你也可以让 git clone
跳过完全是最后一步,没有分支,尽管可能无法从 CI 管道执行此操作:详细信息将取决于 CI 系统。)