您可以在 Git 中标记单个文件夹/文件吗?



我有一个名为"libraries"的存储库。此存储库包含我的项目的多个库文件(例如数学、显示等(,这些文件彼此相对独立。当时,创建单个存储库似乎比为每个单独的库文件创建存储库更容易。

但是,我现在在标记这些文件时遇到了问题。在 Git 中标记本质上会标记整个存储库,这将使我只有一个存储库库版本。但是,我对单独标记文件感兴趣,以便其他项目可以引用特定版本(例如数学 1.0、显示 1.1 等(。

是否将每个文件分解为自己 repo 的唯一解决方案,以便每个文件都可以使用特定版本进行标记?但是,为每个文件都有一个存储库似乎很浪费。

TL;根据TTT:你可以,但你可能不应该。😀

Git 标记标识任何内部 Git 对象。

Git 中标签的正常用例是标记特定的提交,这当然是该提交中所有文件的完整快照,以及有关提交的通常信息 - 谁进行了提交,何时进行,等等,包括其父级或父级的哈希ID,即历史记录所需的一切。 因此,标记提交会标记许多文件,并提供导致该提交的历史记录。

但是,Git 内部的对象是:

标记对象
  • 本身(因此您可以标记标记对象 - 据我所知,这没有任何实际用途,但受支持(;
  • 提交对象(通常的情况(;
  • 对象,表示一个充满文件的目录(包含在提交中(;和
  • Blob对象,表示特定文件的特定版本。

因此,您可以标记一个特定文件的一个特定版本(例如,通过通过提交存储的树对象存储的 blob 对象(或一个包含文件的特定目录:

git tag lightweighttag HEAD:path/to/file.txt
git tag -a annotatedtag HEAD:path/to/

将创建两个这样的标记,指向当前提交中的一个文件和一个目录。 这样做的主要问题是,很少有其他 Git 工具真正了解如何处理这样的标签。 (正如 LeGEC 在评论中指出的那样,您也无法从这里轻松找到任何历史记录:在 Git 存储库中,历史记录是提交,而这些不是提交。

如果名为math-1.0的标签引用了充满文件的特定目录,则以后您可能希望仅将这些文件提取到某个工作区。 为此,您可以使用git archive来制作这些文件的zip或tar存档:

git archive --format=tar math-1.0 | tar -C /path/to/dest -xf -

例如。 但这不是特别方便,这意味着如果您发现错误,您可能需要返回原始存储库进行修复。 如果这些组件应该与其他任何组件分离,那么将它们放在单独的存储库中确实更有意义。

对于您的用例:我会坚持标记提交。

请参阅我对另一个问题的回答:Monorepo 版本标签约定

如果您命名标签:

module1/1.0.0
module1/1.1.0
...
module2/1.0.0
module2/1.0.1
...

您可以轻松列出和排序针对单个模块的标签:

# list tags for module1 :
$ git tag --list 'module1/*'
# list tags and sort them as version numbers
# (e.g : display '1.10' after '1.9', not between '1.1' and '1.2') :
$ git tag --list 'module1/*' --sort="version:refname" 

此外,如果标签的名称可以轻松映射存储库中的目录结构,则可以编写可以针对单个模块的代码和标签的命令:

假设module1的代码在src/module1/中,module2的代码在src/module2/中,business/module3的代码在src/business/module3/中,等等......您可以编写脚本(或函数(,例如:

# script git-logmodule :
module=$1
git log --decorate-refs=refs/tags/$module --decorate-refs=refs/heads -- src/$module

您将获得目标模块的历史记录,仅使用与此模块相关的标记进行装饰。

通过额外的脚本,您可以传递任何您希望git log的额外选项

相关内容

最新更新