说我有这个:
latest_commit=`git rev-parse HEAD`
git checkout -b "foo_$latest_commit"
git reset --soft "origin/dev"我正在做的是跟踪第二支从第一支分化到哪里。但是,与将提交id放入第二个分支的名称不同,是否有一种方法可以将元数据存储在第二个分支中,这样我就不必在分支的名称中放置一个长的提交id了吗?
最终,我想做什么?在使用foo_$latest_commit压缩提交之后,我将将git reset --soft合并到集成分支中。以后,我希望能够安全地删除第一支和第二支。如果第一个分支的尖端与第二个分支的名称中的提交id匹配,我可以安全地删除第一个分支。
发布于 2018-09-01 05:01:07
..。有没有办法把元数据存储在第二分支的某个地方。
不是直接的,不是。
请记住,每个分支名称只是一个指向提交的(可移动的)指针,如果您使用git checkout获取"on“分支,则git commit会自动移动该指针。其他各种命令都愿意以不同的方式移动它:例如,git merge --ff-only将以快速前进的方式移动当前的分支名称,而git reset将任意移动它。
那么:您可以在哪里存储元数据?这有点棘手。
Git由两个主要数据库组成:存储库本身是一个键值存储区,哈希is作为键,存储库对象(blobs、树、提交和带注释的标记)作为值。同时,引用-- refs/heads/*中的分支名称、refs/tags/*中的标记名、refs/stash中的存储库等等--是一个键值存储,其值为散列ID,其值为散列ID。
由于您的目标是(我认为)将一个分支名称与两个不同的散列ID关联起来,一个显而易见的方法就是在refs中创建您自己的命名空间。假设我们选择,例如,refs/bases/。对于名称为B(例如全名refs/heads/B )的分支,只需创建一个refs/bases/B。您唯一可以在refs/bases/B中存储的东西是散列ID,但这正是您想要存储的内容,所以您已经完成了。
如果您希望存储一个简单的散列ID以外的其他内容--例如,如果您想存储另一个名称--您将需要某种类型的数据对象。您的选择是四种对象类型中的任何一种,但其中两种类型受到强烈限制:树或提交必须正确格式化。其中一个是弱约束的:带注释的标记对象必须包含另一个对象的散列ID --注释标记的目标--然后可以包含任意文本。最后一个blob是不受约束的,因为它可能包含任意文本。
若要创建带注释的标记对象,请使用git mktag。有关所需的标记格式,请参阅其文档。
若要创建blob,请使用git hash-object -w (可能与--stdin一起使用);请参阅其文档。
两者都输出一个散列ID,然后您可以将其设置为要存储在refs/bases/B或refs/xyz-meta/B或您选择的任何名称空间下的散列ID。
最后一个音符
对于大多数Git用法,工作方式不是存储基本分支名称,也不存储基提交散列ID。相反,使用set减法请求可达提交,形式如下:
例如,这正是git rebase对传递给它的参数所做的事情:当运行git checkout feature; git rebase develop时,Git枚举所有可从feature到达的提交,减去可从develop到达的所有提交。这在Git中非常常见,因此它有一个git rev-list语法:develop..feature的意思是feature ^develop,意思是“提交可以从feature到达,不包括可从develop到达的提交”。
(元数据技巧所能得到的是自动记住适当的名称,但事实证明,在实践中,大多数人似乎并不需要这个名称。不过,对于你的特殊用法来说,这可能是一件好事。我把这部分放在这里是因为我相信将来,其他人会找到你的问题和答案,并认为这是一个聪明的方式来记住每个派生分支的“基分支”。的确如此,但这不是一件聪明的事情。)
https://stackoverflow.com/questions/52124477
复制相似问题