【问题标题】:How to Tag a single file in GIT如何在 GIT 中标记单个文件
【发布时间】:2011-05-11 05:22:32
【问题描述】:

我对 git 很陌生。我目前正在尝试通过使用它来跟踪我正在维护的一些 excel 文件中的更改来熟悉它,以跟踪我参与的一些持续活动。所有文件都在一个存储库中。我想用它们的版本分别标记每个文件。这可能吗?到目前为止,我发现能够标记整个存储库。如果我尝试做的事情是错误的,请就最佳做法向我提出建议。

提前致谢。

编辑

当我这样做时,我故意删除了以前的标签以使整个存储库被标记(因为我没有找到标记单个文件的方法)为 v1.0。由于我现在想用文件名重置标签的名称,并且对事情的发生方式非常满意,我该如何回滚删除并重命名前一个标签(已删除的标签)?

【问题讨论】:

  • git 标签提交。不是文件。你能告诉我们你想用这些“标签”做什么吗?我认为那时可能会有更合适的答案。

标签: git version-control git-svn


【解决方案1】:

从技术上讲,您可以在没有文件名的情况下标记单个文件的内容。但是这样的标签用途有限。标签应该指向提交,而非提交的特殊标签有非常不同的行为(你不能 git checkout 这样一个特殊的标签)。所以我强烈建议不要使用非提交标签。

当您只想标记一些文件时,最好为它们使用单​​独的 repo,或者至少使用不同的分支,因为 git 总是查看完整的树来进行操作。

如果你仍然坚持要创建这样一个特殊的标签,你可以这样做:

> git ls-tree HEAD
040000 tree 2c186ad49fa24695512df5e41cb5e6f2d33c119b    bar
100644 blob 409940768f2a684935a7d15a29f96e82c487f439    foo.txt

> git tag my-bar-tree 2c186ad49fa24695512df5e41cb5e6f2d33c119b
> git tag my-foo-file 409940768f2a684935a7d15a29f96e82c487f439

【讨论】:

    【解决方案2】:

    你只能标记一个提交,例如存储库历史中的某个快照。但是,git 将文件存储为 blob,您可以使用 git notes 将注释添加到 blob,如下所示:

    $ git ls-tree HEAD
    100644 blob 252f7c7df5bd181536a6c9d0f9c371ce1a5dd042    .gitignore
    100644 blob 8150ada74aba86c983ac3f8f63ab26aaa76fdcb7    README
    100644 blob c4b1ff6dcb2a8e50727df21ced8d2872cd91af79    TODO.txt
    
    $ git notes add -m "Adding a note to TODO" c4b1ff6dcb2a8e507
    $ git notes show c4b1ff6dcb2a8e507
    Adding a note to TODO
    

    但是,请注意,此注释(不是双关语:))仅附加到此 blob,因此每当文件更改时,将创建一个新 blob(具有另一个 sha1 哈希值)并且新 blob 将没有此注释.

    【讨论】:

    • 考虑到您的结尾注释(关于文件更改后更改的 SHA):在我看来,这 预期的行为。没有?
    【解决方案3】:

    标签放置在特定提交上,而不是您在问题中建议的整个存储库。

    按照您的建议进行操作的一种方法是确保每次提交时只提交对单个文件的更改,然后您可以使用例如标记该提交。 file1-v1.0 代表file1的v1.0。

    你想通过标记这些提交来表示什么?这将影响有关如何改进流程的任何建议。

    【讨论】:

    • 谢谢。正如我在我的问题中所说的,我的主要兴趣是更多地了解 git 环境。但是在这个特定的例子中,我想要做的是跟踪一个特定的里程碑,我打算在维护文档时实现这个里程碑。例如:当我完成最初的工作时,我将其标记为 v1.0,当我完成与其他人一起浏览文档并进行所有必要的更改时,我想将其设为 v2.0 等。本质上,如果我做一个作为 v1.0 提交,另一个文件作为 v2.0 提交,那么我将无法实现这一点。实际上两者都应该是 v1.0
    【解决方案4】:

    您应该真正探索使用单独的分支来跟踪特定文件的更改。你应该能够使用它。

    【讨论】:

      【解决方案5】:

      不直接,不。

      标签是指向存储库特定修订版的指针。各个文件本身没有与存储库不同的版本。如果您想要单独的版本,您的选择是为每个文件拥有一个单独的存储库,为每个文件拥有一个单独的分支,或者使用面向文件的不同工具(例如 RCS——尽管它缺少许多不错的功能git 有)。

      如果文件完全相关,您通常确实希望标记它们组的特定版本。如果不是,您仍然可以使用该修订中更改的每个文件的版本标记整个组。将每次修订限制为一个文件的更改可以使此过程更易于管理。

      【讨论】:

      • 谢谢,其实你最后建议的就是我想做的。此外,我一次只根据一个文件提交更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多