Git标记为存储库的子文件夹

BuZ*_*dEE 10 svn git git-svn git-tag

我使用Git导入SVN存储库.然后我创建了自己的项目作为存储库中的子文件夹.

我使用带有Git-SVN的SVN存储库.我的工作程序是:

  1. git commit -am "message"
  2. git svn rebase
  3. git svn dcommit.

现在我想标记我的项目git tag -a RC1 -m 'Release Candidate 1',但我只希望我的项目获得标记.

我怎样才能做到这一点?

tav*_*nab 12

TL; DR版本

如果您知道树的SHA-1,则可以标记特定目录(也称为树),但是通常不会对该标记执行有用的操作并且不容易.

答案很长

Git中的每个对象都有一个独特的SHA-1.最常见的是,SHA-1引用提交,但它们也可以引用blob(文件内容)和树(目录结构和文件名/文件权限映射).您可以在Git Objects文档中阅读它.

例如,假设我在我的存储库中的特定目录中.我可以运行git ls-tree HEAD以获取路径中的文件/目录列表以及它们的SHA-1:

$git ls-tree HEAD
100644 blob ed76d466f5025ce88575770b07a65c49b281ca59    app.css
100644 blob ed58ee4a9be6f5b58e25e5b025b25e6d04549767    app.js
100644 blob e2bed82bd9554fdd89d982b37a8e0659fe82390a    controllers.js
040000 tree f888c44e16f7811ba69a245adf35c4303cb0d4e7    data
100644 blob d68aa862e4746fc9abd0132cc576a4df266b0a9d    directives.js
100644 blob df0ae0e7288617552b373d21f7796adb8fb0d1b6    index.html
040000 tree fa9c05b1bb45fb85821c7b1c27925b2618d646ac    partials
100644 blob 28e9eb6fe697cb5039d1cb093742e90b739ad6af    services.js
Run Code Online (Sandbox Code Playgroud)

然后我可以标记其中一棵树(比如data上面的目录):

$git tag data-1.0 f888c44e16f7811ba69a245adf35c4303cb0d4e7
Run Code Online (Sandbox Code Playgroud)

该标签现在是该SHA-1的别名,我可以在接受树的SHA-1的任何地方使用它:

$git ls-tree -rt data-1.0
100644 blob 6ab0a52a17d14cbc8e30c4bf8d060c4ff58ff971    file1.json
100644 blob e097e393fa72007b0c328d67b70ba1c571854db0    file2.json
040000 tree 39573c56941fdd2fc88747a96bf871550f4affb2    subfolder1
...    ...  ...                                         ...
Run Code Online (Sandbox Code Playgroud)

要取回原来的SHA-1:

$git rev-parse data-1.0
f888c44e16f7811ba69a245adf35c4303cb0d4e7
Run Code Online (Sandbox Code Playgroud)

这一切对你有什么好处?没那么多.但是,如果您愿意编写自己的脚本来重构树的内容,或者找到包含树的提交,那么它可能对您有用.(例如,这个SO答案可以根据这个目的进行调整).

但正如其他人所说,你可能会更容易使用版本控制/标记模型,这种模型可以更好地与Git配合使用,而不是尝试调整现有模型.正如shikjohari及其他人已经提到的,如果你想要项目中有自己版本的项目,请考虑使用Git Submodules.


sle*_*ske 6

你不能.

在Git中,设计标签始终作为一个整体应用于存储库(就像提交和分支一样).这与Subversion不同,Subversion中的标签(只是副本)可以应用于子树.

BTW:即使在Subversion中,通常也不鼓励标记子树,因为它很快就会混淆树的哪一部分被标记.我知道的大多数来源(例如版本控制与Subversion建议始终通过复制标记trunk.

关于你的问题:

通常,单独的项目应该获得单独的Git存储库.在这种情况下,"单独"通常意味着您可能需要单独分支/标记.

如果不这样做/不能做到这一点,最好的办法可能是使用一些标签的前缀,并呼吁所有标签myproj-1.0,myproj-1.1等等.