将旧版本(不受版本控制)添加到git存储库作为标记提交

时间:2018-04-02 14:37:01

标签: git git-tag

我有一个系统sys/master的git存储库,这是我在创建系统一段时间后创建的。我有一个系统sys_bk的备份,它是在创建存储库之前完成的。

在不影响系统最新版本的情况下,将sys_bk版本作为标记版本添加到当前存储库的推荐方法是什么?

仅供参考,sys_bksys/master之间存在巨大差异。

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用git&#39; git checkout --orphan <branch>命令,这样您就可以创建一个没有父级的分支,并将sys_bk文件夹的内容作为初始提交

示例工作流程:

  • git checkout --orphan sys_bk(签出没有父母的新分支)
  • git rm -rf .(删除工作目录中的所有文件)
  • cp /path/to/sys_bk/* ./(将sys_bk个文件移至工作目录中)
  • git add --all .(将所有新sys_bk个文件添加到索引中)
  • git commit -m "Add sys_bk"

答案 1 :(得分:1)

我认为这里真正未解答的问题是,您希望这个新的(/旧)提交如何出现在历史记录中?今天你的历史从以后开始

D -- E -- F <--(master)

现在你有了一些旧版本A。一些用户(他的回答中的jof,StephenNewell和评论中的torek)已经提到了将A添加到您的回购中的方法。这样就可以得到像

这样的东西
D -- E -- F <--(master)

A <--(sys_bk)

然后斯蒂芬·尼威尔建议合并无关的历史,但我真的怀疑你想做什么。您指定不更改项目的当前版本,因此最好它是一种特殊类型的邪恶合并。基本上你最终会

D -- E -- F -- M <--(master)
              /
             A <--(sys_bk)

TREE处的内容(M)不是该历史记录的默认/预期合并结果;相反,它会与TREE的{​​{1}}重复。因此,合并会造成麻烦,而且它并没有很好地反映F在项目历史中的真实位置。

一种选择是让历史不相关。您可以保留用于将A带入回购邮件的sys_bk分支,和/或您可以标记A(这听起来像您打算做的那样),它会保留给任何关心寻找它的人。 (好吧,如果你保留分支而不仅仅是一个标签,可见性可能是最简单的;取决于你记录你正在做什么的方式。)

另一个合理的考虑因素是A看起来像是A的父母。有几种方法可以解决这个问题,有利有弊。

历史重写

重新编写历史记录,以D的父级(粗略)将A物理连接起来,这是您预先支付费用的选项,然后从那时起一切顺利。但是,根据有多少人分享您的回购,前期成本可能非常大,每个人都会支付它是否关心D

如果您想使用此选项,请使用A选项查阅git filter-branch的文档。最后你会得到像

这样的东西
--parent-filter

我使用A -- d -- e -- f <--(master) 来识别dTREE完全相同的新提交。 (关于它的一切都像D,除了它有一个父亲 - D - 而A没有父亲。)这与典型的&#34;重写提交&#34略有不同;从一个基础 - 特别是在D的情况下 - 这就是为什么我使用小写而不是主要符号。但结果是一样的:这些是​​新的提交。

这意味着,假设d(和/或任何其他参考号)已被推送到遥控器,您将不得不强迫推送&#34; - master - 使用新的refs覆盖这些refs,或者只是丢弃遥控器并在其位置放置一个新的。无论哪种方式,每个其他用户都将处于破碎状态,他们必须仔细纠正以避免撤消您已完成的操作(请参阅&#34;从上游Rebase恢复&#34;在{{ 1}} docs)。

对象替换

一种侵入性较小的方法是根据需要更新单个存储库&#34;使他们表现得好像git push -fgit rebase的父母。在这种情况下,任何不关心将A视为D的父级的人都完全不受影响。缺点是(a)它需要在每个需要它的仓库上设置,(b)它有一些已知的错误/怪癖 - 请参阅A文档。

为方便起见,您需要复制提交D。您可以采用与历史重写类似的方式执行此操作,除非您创建一个新分支以重写并保留所有其他分支。

所以你要找出一个引用git replace的表达式。 (也许你得到它的提交ID,或者在我们的例子中我们可以使用D。)

D

然后以与完全重写相同的方式运行master~2,但仅指定 git checkout master~2 git checkout -b sys_bk_replacement 分支(不是git filter-branch,因为您可能将完全重写)。这会给你

sys_bk_replacement

任何希望--all看起来像D -- E -- F <--(master) A <--(sys_bk) \ d <--(sys_bk_replacement) 的父母的人都可以使用A替换D git replace