Git的 - 在删除的文件运行命令时为什么需要双破折号?(Git - why are double

2019-08-22 07:39发布

考虑一个Git仓库,其中一个文件一旦被删除。

git rm path/to/file
git commit -a -m"testing"

好了,现在我想看到的git log的文件,但我收到的经典错误信息:

git log path/to/file
fatal: ambiguous argument 'path/to/file': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

解决方法很简单-增加--

git log -- path/to/file

但为什么? 这是为什么需要? 什么是这里的道理呢? 不能混帐做一个受过教育的猜测,这可能是一个文件一次? 我理解的“模糊性”问题 - 但是,从来没有叫这个名字的标签。 如果文件一旦被删除,并且没有标签存在,然后选择“文件解读”始终是不错的选择。

在另一方面,它可能有一个标签名为同一个文件,该文件git log处理得很好:

fatal: ambiguous argument 'path/to/file': both revision and filename
Use '--' to separate filenames from revisions

这种行为似乎不一致。 谁能解释什么混帐的开发商不得不考虑?

Answer 1:

git log可以在文件以及对分支,标签等上使用。

假设你有一个文件夹,名为a/b/c ,你会用得到提交该文件夹

git log a/b/c

没关系。

你也可以有一个分支叫d/e/f 。 你会用得到提交对这个分支

git log d/e/f

那也没关系。

事情开始变得复杂,如果在项目git log应该工作在不能明确确定。 如果你是愚蠢的,打电话给你的分支 a/b/c也一样,Git有没有线索,其日志应当印:该分支a/b/c目录的日志a/b/c ? 因此,你一定要告诉更多的关于您希望收到的信息:

  • 显示分支的日志a/b/c
    git log a/b/c --
  • 显示该文件夹的日志a/b/c在当前分支:
    git log -- a/b/c
  • 显示该文件夹的日志a/b/ca/b/c的分支:
    git log a/b/c -- a/b/c

随着被删除的文件,你有类似的问题:有既不是所谓的文件path/to/file存在于工作拷贝,也没有一个叫分支path/to/file 。 这就是为什么你必须指定你想要的东西的原因。

当然,混帐会知道一个叫做文件path/to/file 20.000修订前但这需要(最坏情况)来搜索项目的整个历史是否存在或没有这样的文件。

通过后明确指定文件路径--你告诉混帐:

搜索更难该文件,即使这需要时间


结论(回答你的问题):
在你的情况下, --是必要的,因为否则git log将一般工作比较慢。



Answer 2:

为什么当文件存在与当它没有区别呢? 让我们看一下情况:

  1. 的修订和文件名都存在。 显然暧昧。
  2. 的修订存在并且文件名不。 显然也不含糊。
  3. 的修订不存在,文件名一样。 显然也不含糊。
  4. 的修订不存在,文件名没有任何。 暧昧?

的确是。

要知道在某个路径曾经存在过一个文件是否意味着走路历史,打开每个提交,打开每个树遍历树,看看这个路径的存在。 在有很多的提交和深路的大型仓库......这有可能会很贵,尤其是一个缓慢的磁盘上。

但! 你说。 这不正是git log filename做呢? 答案是肯定的,它是。 不同的是,当我运行git log filename和文件已知存在,那么git-log 都知道 ,我想花时间去这段历史。

相反,如果我跑git log foo和Foo不是一个修订版或当前存在的话,那就需要投入的时间遍历整个图形刚刚告诉我,一个文件foo含糊不清。

哎哟。

所以,欢迎您说git log -- filename来告诉混帐,你真的想要去散步图。 否则,它会下降。

附注:混帐只是stat(2)就是你给的命令行参数来确定文件是否存在。 它看起来并不在索引中,也没有打开你的头树。 这可能,当然,做这些事情,这样可以让你使用git log filename ,其中filename是不是上演犯删除。 这似乎是一个非常合理的变化。



Answer 3:

从来就没有叫这个名字的标签。

为什么这么说? git tag path/to/file工作得很好。

这真的是那样简单,因为它看起来: git rm只需要路径名; git log需要裁判名和路径名,refnames第一,以及其他可能是一个路径也可能是裁判的名字-这是不是这么多,这可能是一个裁判的名字作为定义的规则。

在小项目它会是容易的git的日志来决定,如果它是有效的,在所有它已经在一些点源文件的路径,但在这一点上,你必须做出判断,调用平衡的可能性和成本所有在这里的可能的screwups。 它是更有可能的是你问的日志不再存在的文件,或者你fatfingered现有路径名,或现有的裁判? git log remote/ref是很常见的。 我认为Git的只是假设匹配任何电流有可能的是一个错字的名称。



文章来源: Git - why are double dashes needed when running a command on a deleted file?
标签: git git-log