【问题标题】:git (complex) transform file on commit提交时的 git(复杂)转换文件
【发布时间】:2020-03-24 20:19:54
【问题描述】:

我有一些格式的文件(我们称它们为 *.db 文件)无法被 git 正确区分/合并。但是,可以将这些文件中的每一个转换为 git 可以正确处理的文件结构——对于每个 db 文件,我们可以生成一个目录树,以便该树中的每个文件都是可以区分的常规文本文件/由 git 合并(我们称这个过程为“解构”)。此外,该目录树的内容可以组合在一起以(重新)构建原始 db 文件。这种方法允许我们将标准 git 托管与所有常见的工作流程(拉取请求、自动合并等)一起使用这些特殊文件。

现在来看实际问题:我想让这一切对用户完全透明。也就是说,每当用户暂存 db 文件时,我都希望“解构”脚本自动运行转换后的表示形式。同样,无论何时运行结帐操作,我都希望运行“构造”脚本,以便用户获取正确的 db 文件。这也应该适用于git add -a 等。我希望这一切都发生在客户端,因为我无法更改远程配置(所以自定义合并工具也不可能出现)。

如果在远程数据以解构形式出现是可以的。事实上,理想情况下,我希望看到类似

data.db/
  1.txt
  2.txt
  ....
  n.txt

在远程获取本地存储库中的文件data.db — 但我不知道这是否可能。这意味着本地 git 将能够在暂存区域中创建此解构形式(并提交)+ 将其重建为 db 文件,而解构形式不会接触实际工作目录。

我认为至少上述的某些方面会起作用(否则像 git-lfs 这样的工具是如何做到的?),但我不知道有什么限制以及从哪里开始寻找。我知道预提交等钩子,但我认为它们不允许我直接操作暂存区域。

如果有人能针对如何完成此工作流程制定一个攻击计划,我将不胜感激。

【问题讨论】:

    标签: git


    【解决方案1】:

    您应该查看内容过滤器:

    请参阅 Pro Git 书籍中的 "Attributes" chapter,向下滚动到 content filter 部分。

    我通过阅读VonC's answer 中的一个@(更简单的)内容问题了解到他们的存在。

    如果你只想区分,属性一章也有一个如何处理binary files before diffing的例子。


    阅读git help gitattributes,并向下查看filter部分的详细信息:
    定义过滤器时,您可以使用%f 将文件路径作为参数传递给您的处理脚本。

    你可以用它来:

    • clean

      • 从原始文件名构建目标路径,例如:文件foo.db的扩展数据实际上将存储在名为.foo.db.d/的目录下,

      • 让脚本构建展开的内容并暂存它,

      • 将实际暂存文件foo.db的内容替换为扩展数据的路径.foo.db.d
    • smudge:

      • 从文件foo.db读取扩展内容的路径
      • 将展开的内容合并到一个foo.db 文件中
      • 不知何故签出.foo.db.d目录(还不确定如何实现该部分)

    还在git help attributes

    还有一种方法可以定义filter.<name>.process 命令(而不是两个.clean.smudge 命令),让您可以更深入地挖掘git“看到”的内容。

    如果你想从那个兔子洞里跑下来:在 Ubuntu 上,我必须安装 git-doc 软件包才能访问help 页面中提到的详细文档:technical/long-running-process.txt

    【讨论】:

    • 2013 年的答案......那时我还很年轻,而且知之甚少。现在,好吧,我只是年纪大了。注意:我有 179 个这样的答案 (stackoverflow.com/search?q=user%3A6309+%22content+filter%22)
    • 我确实看过内容过滤器,但我的印象是它们“只是”过滤器——也就是说,一个流进来,一个流出去。如何使用它们将文件拆分为多个文件,反之亦然?
    • @MrMobster : 你可以在git help gitattributes 中读到很多有趣的东西;我自己发现了它们,并且通过文档链接中提供的插图,技术细节很有意义。
    • 不幸的是,这并没有真正起作用,因为无法从过滤器中操作暂存区域。我曾尝试将过滤器与提交挂钩结合使用,但找不到令人满意的解决方案。似乎回到绘图板。
    • @MrMobster : 有什么东西阻止了从过滤器脚本中运行git addgit hash-object -wgit write-tree 吗? (我只是好奇)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2015-12-30
    • 1970-01-01
    • 2019-06-01
    • 2015-10-08
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多