将更改从universal diff导入git存储库
我试图将更改从一个源代码控制系统(专有且复杂)导入git存储库。目前,我通过运行一个脚本来实现这一点,该脚本只需按顺序同步到每个版本,并将其提交到git存储库,但由于各种原因,这变得不可行 对于每一次修订,我都可以得到一个描述更改的通用差异。对我来说,这似乎足以将历史导入git,但我一辈子都不知道如何让git做到这一点。看起来我需要介于git apply和git fast import之间的东西。也许我应该从以前的版本和diff中构造文件内容,然后使用git快速导入?或者我应该将diff格式化为git补丁,将其保存为文件,然后使用git apply 有人有什么好主意给我吗 编辑:同步和提交变得不可行的原因有两个: 首先,服务器维护已编辑文件的列表。与编辑过的文件同步不容易实现自动化,因此我在更新时还原更改。我们有一个签入队列系统,只允许您在前面没有人拥有与您相同的“正在编辑”文件时签入。因此,将文件“停止编辑”以进行更新会创建一个窗口,在该窗口中,人们可以安全地跳到您的前面 其次,所有分支都存储在同一个存储库中,我们大量使用分支。同步所有内容都很容易,而且很有效,只同步一个目录(我所在分支的目录)似乎有问题。但是,如果我同步所有内容,其他分支会在我不希望它们同步时更新。这通常不会是一个问题,但我们有另一个工具,使事情。。。复杂。将更改从universal diff导入git存储库,git,diff,Git,Diff,我试图将更改从一个源代码控制系统(专有且复杂)导入git存储库。目前,我通过运行一个脚本来实现这一点,该脚本只需按顺序同步到每个版本,并将其提交到git存储库,但由于各种原因,这变得不可行 对于每一次修订,我都可以得到一个描述更改的通用差异。对我来说,这似乎足以将历史导入git,但我一辈子都不知道如何让git做到这一点。看起来我需要介于git apply和git fast import之间的东西。也许我应该从以前的版本和diff中构造文件内容,然后使用git快速导入?或者我应该将diff格式化为
命令接受一个统一的diff并应用它(也就是说,没有“git补丁格式”,它只是统一的diff;apply
将愉快地读取标准输入,因此无需保存任何内容)git apply-
命令获取一个带有补丁的mbox格式文件,并应用和提交每个补丁。您可能能够轻松地生成此文件;很简单:am
From au@th.or Mon, 23 May 2011 14:49:12 +0200 From: au@th.or Date: Mon, 23 May 2011 14:49:12 +0200 Subject: First line of commit message Content-length: <bytes-until-next From> Other lines of commit message --- unified diff
连接所有修订来自au@th.or2011年5月23日星期一14:49:12+0200 发件人:au@th.or 日期:2011年5月23日星期一14:49:12+0200 主题:提交消息的第一行 内容长度: 提交消息的其他行 --- 标准差异
- 确实,
似乎不接受diff,但您能否要求源系统提供修订的内容(这将处理无法构建统一diff的二进制文件)?如果没有,您可以要求fast import
为您提供以前的内容(使用fast import
命令),对其进行修补并重新输入cat blob
git提交
,而不会产生冲突。为此,我使用我的主分支。我从功能分支签入新功能的工作流如下所示:
我不需要费心从上游获取每一个版本,但您可以通过为每个上游版本执行步骤2-4来实现这一点。哦,希望编辑完答案。您能告诉我们它是哪个系统吗?这不是ClearCase还是Synergy?也许有人知道特定的系统,可以告诉你如何在不同步任何东西的情况下从中获取全文(包括ClearCase在内的大多数系统都有一个命令,可以在不签出文件的情况下获取特定文件的特定版本,如果你找到了,你可以将其用于快速导入)。你是对的,那就太完美了!我怀疑有很多人对此很了解——它被称为“SourceDepot”,微软使用的一种内部工具。据我所知,这是一个非常古老的fork of Perforce。啊,我甚至没有考虑过二进制文件。你说得对,我不能使用diff将更改导入二进制文件。我可以得到修订的内容,是的,但这是有问题的(这是我以前做的)。不过,在获取单个文件时,问题并不大。所以我现在想的是,我使用
git apply
导入文本文件更改,然后在每次修订时检查是否有任何二进制修改,然后同步这些文件并修改提交。我现在要调查一下。好吧,这看起来并不完全可靠,风投有一些奇怪的行为。回到第1步:)是的,这正是我当前脚本的基本功能!包括对每个版本重复2-4次(我喜欢有历史记录,这样我可以把问题归咎于同事)。我刚刚更新了我的问题,以说明同步的问题是什么。我想避免与其他风投同步,真的。好吧,我将继续这条路线,因为似乎没有更好的方法。我只需要改进我的脚本,自动进行取消编辑和重新编辑,以尽量减少我没有明显变化的时间窗口。我找到了一种方法来解决更新其他分支的问题——结果发现我只是语法错误。使用这样一个过时的系统很容易!