Git - 从补丁文件重建/克隆

时间:2014-10-01 05:41:45

标签: git merge patch

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

可接受的候选者是补丁文件(安全扫描知道在补丁的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,而不是{1}}
  • 的{1}},而不是{1}}的{​​{1}}

之后我们只需要将分支重命名为真实姓名,然后完成。我没有看到瑕疵,但还没有实施。

问题:

  • 是否存在用于此目的的现有工作解决方案(脚本,工具)?
  • 如果不是 - 在我描述的过程中存在任何缺陷,这将使其无法准确反映它们之间正确连接的提交(我们不要必须保留原文提交哈希)?

1 个答案:

答案 0 :(得分: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

for commit - 我不知道直接读入git cat-file -p输出的低级命令。格式是规则的,所以应该不难。摘自以下

tree ca1fdb46ebf7f2c5dece94f21cec3385e22fb6dd 
parent d685ab16fe1ecf67b77b36bda711d8189f3a54a3 
author Andrew <andrew@nowhere.com> 1411616364 -0700 
committer Andrew <andrew@nowhere.com> 1411616364 -0700

commit message

然后做

GIT_AUTHOR_NAME= Andrew GIT_AUTHOR_EMAIL=andrew@nowhere.come (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}

然后除此之外,您需要传递所有的refs和whatnot,这些文本文件应该是文本文件,因此它是直接副本。

祝你好运。 〜A