考虑一个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
这种行为似乎不一致。 谁能解释什么混帐的开发商不得不考虑?
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/c
在a/b/c
的分支:
git log a/b/c -- a/b/c
随着被删除的文件,你有类似的问题:有既不是所谓的文件path/to/file
存在于工作拷贝,也没有一个叫分支path/to/file
。 这就是为什么你必须指定你想要的东西的原因。
当然,混帐会知道有一个叫做文件path/to/file
20.000修订前但这需要(最坏情况)来搜索项目的整个历史是否存在或没有这样的文件。
通过后明确指定文件路径--
你告诉混帐:
搜索更难该文件,即使这需要时间
结论(回答你的问题):
在你的情况下, --
是必要的,因为否则git log
将一般工作比较慢。
为什么当文件存在与当它没有区别呢? 让我们看一下情况:
- 的修订和文件名都存在。 显然暧昧。
- 的修订存在并且文件名不。 显然也不含糊。
- 的修订不存在,文件名一样。 显然也不含糊。
- 的修订不存在,文件名没有任何。 暧昧?
的确是。
要知道在某个路径曾经存在过一个文件是否意味着走路历史,打开每个提交,打开每个树遍历树,看看这个路径的存在。 在有很多的提交和深路的大型仓库......这有可能会很贵,尤其是一个缓慢的磁盘上。
但! 你说。 这不正是git log filename
做呢? 答案是肯定的,它是。 不同的是,当我运行git log filename
和文件已知存在,那么git-log
都知道 ,我想花时间去这段历史。
相反,如果我跑git log foo
和Foo不是一个修订版或当前存在的话,那就需要投入的时间遍历整个图形刚刚告诉我,一个文件foo
含糊不清。
哎哟。
所以,欢迎您说git log -- filename
来告诉混帐,你真的想要去散步图。 否则,它会下降。
附注:混帐只是stat(2)
就是你给的命令行参数来确定文件是否存在。 它看起来并不在索引中,也没有打开你的头树。 这可能,当然,做这些事情,这样可以让你使用git log filename
,其中filename
是不是上演犯删除。 这似乎是一个非常合理的变化。
从来就没有叫这个名字的标签。
为什么这么说? 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?