将更改从universal diff导入git存储库

将更改从universal diff导入git存储库,git,diff,Git,Diff,我试图将更改从一个源代码控制系统(专有且复杂)导入git存储库。目前,我通过运行一个脚本来实现这一点,该脚本只需按顺序同步到每个版本,并将其提交到git存储库,但由于各种原因,这变得不可行 对于每一次修订,我都可以得到一个描述更改的通用差异。对我来说,这似乎足以将历史导入git,但我一辈子都不知道如何让git做到这一点。看起来我需要介于git apply和git fast import之间的东西。也许我应该从以前的版本和diff中构造文件内容,然后使用git快速导入?或者我应该将diff格式化为

我试图将更改从一个源代码控制系统(专有且复杂)导入git存储库。目前,我通过运行一个脚本来实现这一点,该脚本只需按顺序同步到每个版本,并将其提交到git存储库,但由于各种原因,这变得不可行

对于每一次修订,我都可以得到一个描述更改的通用差异。对我来说,这似乎足以将历史导入git,但我一辈子都不知道如何让git做到这一点。看起来我需要介于git apply和git fast import之间的东西。也许我应该从以前的版本和diff中构造文件内容,然后使用git快速导入?或者我应该将diff格式化为git补丁,将其保存为文件,然后使用git apply

有人有什么好主意给我吗

编辑:同步和提交变得不可行的原因有两个:

首先,服务器维护已编辑文件的列表。与编辑过的文件同步不容易实现自动化,因此我在更新时还原更改。我们有一个签入队列系统,只允许您在前面没有人拥有与您相同的“正在编辑”文件时签入。因此,将文件“停止编辑”以进行更新会创建一个窗口,在该窗口中,人们可以安全地跳到您的前面

其次,所有分支都存储在同一个存储库中,我们大量使用分支。同步所有内容都很容易,而且很有效,只同步一个目录(我所在分支的目录)似乎有问题。但是,如果我同步所有内容,其他分支会在我不希望它们同步时更新。这通常不会是一个问题,但我们有另一个工具,使事情。。。复杂。

  • apply
    命令接受一个统一的diff并应用它(也就是说,没有“git补丁格式”,它只是统一的diff;
    git apply-
    将愉快地读取标准输入,因此无需保存任何内容)
  • am
    命令获取一个带有补丁的mbox格式文件,并应用和提交每个补丁。您可能能够轻松地生成此文件;很简单:

    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
    主题:提交消息的第一行
    内容长度:
    提交消息的其他行
    ---
    标准差异
    
    连接所有修订

  • 确实,
    fast import
    似乎不接受diff,但您能否要求源系统提供修订的内容(这将处理无法构建统一diff的二进制文件)?如果没有,您可以要求
    fast import
    为您提供以前的内容(使用
    cat blob
    命令),对其进行修补并重新输入
我不知道你的“这变得不可行的各种原因”是什么,但我已经在工作中成功地做了很长一段时间了,所以我很熟悉这些陷阱。诀窍是将您的上游保持在一个单独的分支中,这样您就可以始终进行同步和
git提交
,而不会产生冲突。为此,我使用我的主分支。我从功能分支签入新功能的工作流如下所示:

  • git签出主机
  • 同步到集中式VCS
  • git添加-A
  • git提交-m“从上游同步”
  • git合并功能
  • 签入到集中式VCS
  • git签出-b nextfeature

  • 我不需要费心从上游获取每一个版本,但您可以通过为每个上游版本执行步骤2-4来实现这一点。

    哦,希望编辑完答案。您能告诉我们它是哪个系统吗?这不是ClearCase还是Synergy?也许有人知道特定的系统,可以告诉你如何在不同步任何东西的情况下从中获取全文(包括ClearCase在内的大多数系统都有一个命令,可以在不签出文件的情况下获取特定文件的特定版本,如果你找到了,你可以将其用于快速导入)。你是对的,那就太完美了!我怀疑有很多人对此很了解——它被称为“SourceDepot”,微软使用的一种内部工具。据我所知,这是一个非常古老的fork of Perforce。啊,我甚至没有考虑过二进制文件。你说得对,我不能使用diff将更改导入二进制文件。我可以得到修订的内容,是的,但这是有问题的(这是我以前做的)。不过,在获取单个文件时,问题并不大。所以我现在想的是,我使用
    git apply
    导入文本文件更改,然后在每次修订时检查是否有任何二进制修改,然后同步这些文件并修改提交。我现在要调查一下。好吧,这看起来并不完全可靠,风投有一些奇怪的行为。回到第1步:)是的,这正是我当前脚本的基本功能!包括对每个版本重复2-4次(我喜欢有历史记录,这样我可以把问题归咎于同事)。我刚刚更新了我的问题,以说明同步的问题是什么。我想避免与其他风投同步,真的。好吧,我将继续这条路线,因为似乎没有更好的方法。我只需要改进我的脚本,自动进行取消编辑和重新编辑,以尽量减少我没有明显变化的时间窗口。我找到了一种方法来解决更新其他分支的问题——结果发现我只是语法错误。使用这样一个过时的系统很容易!