我们可以从git存储库中标记单个文件夹吗?
我们有一个包含不同文件夹的git存储库,我们不想标记整个存储库。我们只想标记来自该git存储库的单个文件夹。
拥有不同的存储库而不是拥有单个存储库是可能的还是更好的?
不,你不能将标签与git存储库中的文件夹相关联
这是因为每个标记都与特定的提交相关联。
因此,每个提交都指向包含两个文件夹的整个存储库。
如果您的每个文件夹彼此无关,那么您肯定应该有两个独立的存储库。
让我们想象一下这个时间表:
* 4bde21c 5m ago, Fix spelling (master)
* 4bde21c 10h ago, Fix foo (v1.0-foo)
* 7cdeba1 3 days ago, Fix bar (v1.0-bar)
* 3cd4aa1 10 days ago, Create bar
* 21a57d2 1 month ago, Create foo
标签v1.0-foo
和v1.0-bar
只是对提交的引用:
v1.0-foo -> 4bde21c
v1.0-bar -> 7cdeba1
那么您如何在标签bar
上考虑v1.0-foo
存储库的版本?
不知道为什么你想要它,所以我只是给出一些提示。
Git存储库中具有跟踪文件的文件夹具有自己的修订版本,存储为树对象。该对象记录其文件和子文件夹的名称以及它们自己的对象哈希值。但该对象不存储自己的路径,该路径存储在其父文件夹的树对象中。如果它是存储库的根文件夹,则根本不存储其路径。因为它在克隆或初始化时可以是任何名称。
假设文件夹中的文件夹路径是./foo
。你可以运行git ls-tree <commit> -- foo
或git rev-parse <commit>:foo
来查看foo
的树形哈希值。您可以通过git tag <tagname> <tree_hash>
标记它,或者通过git tag <tagname> <commit>:foo
不知道它的哈希值。
使用标记,您可以推送或获取所涉及的对象,或提取实际文件和子文件夹,或使用管道命令对其进行操作。
由于我们可以使用<commit>:<path>
来描述文件夹的路径和内容,因此如果您知道提交和路径,则不必创建额外的标记。