【问题标题】:Git - Rebuilding/Cloning from patch filesGit - 从补丁文件重建/克隆
【发布时间】:2014-11-25 21:44:17
【问题描述】:

我们需要将 Git 存储库从一个网络导入到另一个网络。出于安全原因,它必须作为文本文件传递,代表内部文件的可读版本(存储库的所有 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,比第一父差异的git apply,比git commit ...

之后,我们只需要将分支重命名为真实名称,就完成了。我没有看到缺陷,但它还没有实现。

问题:

  • 是否存在用于此目的的有效解决方案(脚本、工具)?
  • 如果不是 - 我描述的过程中是否存在任何缺陷,导致无法准确反映提交之间的正确连接(我们不必保留原始 提交哈希)?

【问题讨论】:

    标签: git merge patch


    【解决方案1】:

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

    以下内容完全未经测试。使用风险自负。

    请参阅此处的链接,现在我将使用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 <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 和诸如此类的东西,它们应该已经是文本文件,所以这是一个直接副本。

    祝你好运。 ~A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2015-05-21
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多