2014-10-01 91 views
0

我们需要将Git Repository从一个网络导入到另一个网络。对于安全性提升,它必须作为文本文件传递,它表示内部文件的可读版本(存储库中的所有Blob,或者至少包含两个Blob之间的所有差异)。从.git目录创建tar并不好(安全扫描不可读),也不是git bundle格式。Git - 从补丁文件重建/克隆

这个应用程序是补丁文件(安全扫描知道要在补丁的base64中处理二进制文件)。它适用于线性回购,但我们也需要合并提交。我们想过脚本会在源做:git log -p -m --parents --first-parent > file,并在DEST将解析该文件,并会:

  • 应用它承诺通过git am
  • 承诺在父母一方的每个分支(第二个孩子)将创建分支(名称branch<hash-of-first-commit>
  • 每个合并会做:git merge <branch-name> --no-commit -s ours,比第一父的diff git apply,比git commit ...

是后W只需要将分支重命名为实名,然后完成。我没有看到缺陷,但尚未实施。

问题:

  • 是否有存在的,为此,工作液(脚本工具)?
  • 如果没有 - 疗法是我描述,这将使它不准确反映它们之间的正确连接的提交过程中的任何缺陷(我们必须保持原有的提交哈希)?

回答

0

这是我听到的最疯狂的一段时间。

以下是完全未经测试的。使用风险自负。

看到这里的链接,现在我只想用git rev-list --objects HEAD作为替身你会真正需要做的就是所有对象

Getting all objects in a database

总结各地得到一个简单的脚本您的对象,找出它是什么类型的对象,然后以文本格式存储对象类型,SHA和内容。您可以创建4个目录(blob,commit,tree,tag),然后在每个sha的名称中存储一个文件,并使内容成为sha的文本。

#/bin/sh 
for sha in $(git rev-list --objects HEAD | awk '{print $1}') 
do 
    objType=$(git cat-file -t ${sha}) 
    git cat-file -p ${sha} > <path>/${objType}/${sha} 
done 

理论上,无论如何,这将创建您的对象的所有文本表示形式。转移他们,然后扭转过程。

为BLOB文件你可以使用

cat <path>/blob/${sha} | git hash-object -w 

的树,你会使用

cat <path>/tree/${sha} | git mktree 

的承诺 - 我不知道低水平命令来在git cat-file -p输出直接读取。格式是常规的,所以不应该很难。从以下

tree ca1fdb46ebf7f2c5dece94f21cec3385e22fb6dd 
parent d685ab16fe1ecf67b77b36bda711d8189f3a54a3 
author Andrew <[email protected]> 1411616364 -0700 
committer Andrew <[email protected]> 1411616364 -0700 

commit message 

提取然后做

GIT_AUTHOR_NAME= Andrew [email protected] (etc. for dates and commtiter info) git commit-tree $(TREE_SHA) -p $(PARENT SHA) [ more parents if needed ] -m "MESSAGE" 

解析这一切,传递给git commit-tree除非你有更好的东西。

对于标签,你应该能够做到

cat <path>/tag/${sha} | git mktag > .git/refs/tags/${TAG_NAME} 

那么除了那你需要在通过所有的裁判和诸如此类的东西,这应该是文本文件已经所以这是一个直接复制。

祝你好运。 〜A