我们需要将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}} 之后我们只需要将分支重命名为真实姓名,然后完成。我没有看到瑕疵,但还没有实施。
问题:
答案 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