我有两个存储库:
现在我决定将我们的项目移动到git存储库并将更改与原始项目合并
我现在已经使用git-svn
从svn迁移了git资源库我的文件没有超出项目开始时间的更改历史记录
我可以将存储库的初始状态映射到原始存储库的状态吗?换句话说,我想从特定版本开始将我们的更改应用于原始存储库。
更新
今天我发现了另一个障碍。架构优先:
红色分支是原始项目
<alpha1>
和<alpha2>
是主要项目的插件提交(与<E' E'' E'''>
中提交的代码无关)
<E'> <E''> <E'''>
中添加了来自主项目(红色)存储库<E>
的代码(在每个提交cca中,来自<E>
的项目的三分之一)
我已将红色和蓝色存储库合二为一。在第二个模式我有所需的状态。是否有可能做到这一点? (例如,从<E' E'' E''>
只提交一个提交(<E'>
),然后将该提交标记为从分支<ABCD>
和<alpha1 alpha2>
合并
谢谢Julien的回复。这似乎非常有帮助。
答案 0 :(得分:5)
免责声明:我现在对此进行了测试,看起来它的效果与预期相符(假设我当然理解正确)。但是,还有很多可能出错的地方。 绝对只在项目存储库的单独工作副本上尝试这一点,并确保在将其推送到任何地方之前检查所有内容。在执行此操作之前,请保留状态的完整目录备份。
所以我假设你有两个独立的存储库。原始项目(Gephi):
A---B---C---D---E
^ HEAD of Gephi
您的项目,其第一个修订版看起来与原始项目的最新版本相同:
E'---V---W---Y---...---Z
^ HEAD of your project
(可能有一些分支,但这在这里并不重要。)
您希望拥有的内容(如果我理解正确的话)是:
A---B---C---D---E---V---W---Y---...---Z
您可以尝试以下方法。 再次,在您自己的独立工作树上执行此操作,并确保在将其推送到任何中央存储库之前一切正常!
在您自己的工作树的目录中,获取原始Gephi存储库的头部和对象:
git fetch /path/to/original/gephi
如果你还没有克隆Gephi存储库,你也可以指定github URL而不是本地文件系统路径。
这将导致当前工作树中出现以下情况:
A---B---C---D---E
^ FETCH_HEAD
E'---V---W---Y---...---Z
^ HEAD
我们没有太多变化。目前,这两个元首并存并完全独立,但您现在可以从两个存储库访问这些对象,并可以尝试将它们组合起来。
我们现在想要丢弃E'(它应该与E相同),而是使E成为项目第一次提交的父级,即V.为此,您可以使用git filter-branch
:
git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat'
分别用V和E的提交哈希值替换<V>
和<E>
。要查找这些内容,您可以git log
检查项目的提交,并且,因为我们已经提取它们,git log FETCH_HEAD
来检查Gephi的提交。
这将有效地将V直接连接到E。
如果事实证明原始Gephi存储库的头部(即最新提交)不是您的项目基础,这甚至可以工作,这意味着Gephi中有新的提交您没有(然而?)照顾。请确保,再次将<E>
替换为基于您的更改的提交的哈希,不的头部。
相反,请确保使用首次更改的哈希值替换<V>
。也许您的存储库不包含与E相同的E',但第一次提交已包含对原始的更改。然后,第一个提交哈希将是您的<V>
,而不是之后的那个。
总结最后几段:如果您的情况如下,上述命令也应该有效:例如:
A---B---C---D---E---F---G---H---I
^ ^ FETCH_HEAD
point where your project branched off
V---W---Y---...---Z
^ ^ HEAD
first change based on E
请确保使用在此上下文中有意义的提交哈希值。
答案 1 :(得分:1)
听起来您可能想要调查grafts(或可能是replacements) - 这些方法与filter-branch
和rebase
的不同之处在于它们将元数据添加到更改存储库的可见状态,而不是重写历史记录以实际影响更改。当人们使用现有分支时,这非常有用,因为它可以避免从其下面更改历史记录。
在您的情况下,您需要为E'
添加移植,并将E
作为额外的父级。