我正在尝试将更改从一个源控制系统(专有和复杂)导入到git存储库中。我目前正在通过运行一个脚本来执行此操作,该脚本只是按顺序同步到每个修订版并将其提交到git存储库,但由于各种原因,这已变得不可行。
对于每个修订版,我都可以获得描述更改的通用差异。对我来说,似乎这应该足以将历史导入git,但我不能为我的生活弄清楚如何让git这样做。看起来我需要git-apply和git-fast-import之间的东西。也许我应该从以前的版本和diff构建文件内容,然后使用git-fast-import?或许我应该将diff格式化为git补丁,将其保存为文件,并使用git-apply?
任何人对我都有好主意吗?
编辑:同步和提交变得不可行的原因有两个:
首先,服务器维护您已编辑的文件列表。与编辑过的文件同步无法轻松实现自动化,因此我会在更新时还原我的更改。我们有一个签入队列系统,只允许您在当前没有人拥有与您一样的任何相同文件时签入。因此,将文件“关闭编辑”更新以创建一个窗口,看起来人们可以安全地跳到你前面。
其次,所有分支都存储在同一个存储库中,我们大量使用分支。同步一切很容易并且有效,同步一个目录(我所在的分支的目录)似乎有些错误。如果我同步所有内容,其他分支会在我不希望它们时更新。这通常不是问题,但我们有另一种工具,这使得事情变得复杂。
答案 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
而不会产生冲突。我为此目的使用我的主分支。我从功能分支检入新功能的工作流程如下:
我不打算从上游获取每一个修订版,但是你可以通过为每个上游版本执行步骤2-4来实现这一点。