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

时间:2011-05-23 12:45:16

标签: git diff

我正在尝试将更改从一个源控制系统(专有和复杂)导入到git存储库中。我目前正在通过运行一个脚本来执行此操作,该脚本只是按顺序同步到每个修订版并将其提交到git存储库,但由于各种原因,这已变得不可行。

对于每个修订版,我都可以获得描述更改的通用差异。对我来说,似乎这应该足以将历史导入git,但我不能为我的生活弄清楚如何让git这样做。看起来我需要git-apply和git-fast-import之间的东西。也许我应该从以前的版本和diff构建文件内容,然后使用git-fast-import?或许我应该将diff格式化为git补丁,将其保存为文件,并使用git-apply?

任何人对我都有好主意吗?

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

首先,服务器维护您已编辑的文件列表。与编辑过的文件同步无法轻松实现自动化,因此我会在更新时还原我的更改。我们有一个签入队列系统,只允许您在当前没有人拥有与您一样的任何相同文件时签入。因此,将文件“关闭编辑”更新以创建一个窗口,看起来人们可以安全地跳到你前面。

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

2 个答案:

答案 0 :(得分:4)

  • 采用统一差异并应用它的apply命令(即没有“git补丁格式”,它只是统一差异;同样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
    

    连接所有修订。

  • 确实似乎fast-import不接受差异,但是你不能只要求源系统给你修改的内容(这将处理无法构造统一差异的二进制文件) )?如果没有,您可以要求fast-import向您提供之前的内容(使用cat-blob命令),对其进行修补并再次输入。

答案 1 :(得分:3)

我不知道你的“各种原因已经变得不可行了”,但是我已经成功地做了这件事,但是我很熟悉这些陷阱。诀窍是将您的上游保持在一个单独的分支中,这样您就可以始终执行同步和git commit而不会产生冲突。我为此目的使用我的主分支。我从功能分支检入新功能的工作流程如下:

  1. git checkout master
  2. 同步到集中式VCS
  3. git add -A
  4. git commit -m“从上游同步”
  5. git merge feature
  6. 签入集中式VCS
  7. git checkout -b nextfeature
  8. 我不打算从上游获取每一个修订版,但是你可以通过为每个上游版本执行步骤2-4来实现这一点。