【问题标题】:How to generate a git diff (patch) of a mode change to a binary file?如何生成模式更改到二进制文件的 git diff(补丁)?
【发布时间】:2012-01-04 19:13:07
【问题描述】:

我有一个包含一些二进制文件的 git 存储库。我已将 chmod 755 暂存到其中一个二进制文件中,并且我想生成此模式更改的差异,该差异可以使用 git-apply 应用到另一台机器上。我正在使用:

git diff --no-color --no-ext-diff --binary --cached 560d4ad7ca02fe3cb2403da89fadae0c27fbbe73

这适用于非二进制模式更改,即使二进制模式更改,只要二进制本身也发生了更改。但是如果只是二进制文件上的模式发生了变化,那么上面的 diff 是空的。

如果我使用,我可以从 git diff 获得输出:

git diff --no-color --no-ext-diff --binary --cached --raw 560d4ad7ca02fe3cb2403da89fadae0c27fbbe73

很遗憾,上述命令的输出无法输入到 git apply 中:

:100644 100755 e944703... e944703... M  asbserver

有什么想法吗?如果二进制文件的内容发生变化以及模式发生变化,那么差异对我来说似乎很奇怪?

【问题讨论】:

    标签: git git-diff


    【解决方案1】:
    $ chmod +x foo
    $ git diff
    diff --git a/foo b/foo
    old mode 100644
    new mode 100755
    

    我得到一个似乎可用的差异。也许您的问题更多地出现在应用方面。你是如何应用你的补丁的?您在使用--apply switch 吗? (在某些情况下可能需要,这取决于您的完整命令)。

    按照评论编辑:我得到一个二进制文件:

    $ chmod +x favicon.ico
    $ git diff
    diff --git a/assets/favicon.ico b/assets/favicon.ico
    old mode 100644
    new mode 100755
    

    并且 favicon.ico 被正确猜测为二进制:

    $ git show f948cbeb33532d0803a9c | grep favicon
    diff --git a/assets/favicon.ico b/assets/favicon.ico
    Binary files /dev/null and b/assets/favicon.ico differ
    

    【讨论】:

    • 您创建的“foo”文件似乎不是二进制文件。这适用于非二进制文件。用二进制文件试试。问题不在应用方面,问题是 'git diff' 给出 0 输出。
    • 更新了对二进制文件的差异。你的项目 .git/config 中是否有一些东西可能会影响 diff 命令的运行方式?
    • 不,看起来不像。唯一的设置是 filemode=true 和 repositoryformatversion=0。您确定 git 将您的 ico 文件视为二进制文件吗?你在哪个操作系统上?
    • 在添加 favicon.ico 文件时添加了提交差异的 grep。我在 Linux 上。
    • 有趣。这真的很奇怪。我已经在各种存储库和二进制文件上尝试过这个并且总是得到相同的东西:如果我只更改文件模式,git diff 不会显示任何输出,但如果我也修改了内容,它确实会显示文件模式更改二进制文件。你的 git 配置有什么特别的吗?
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多