首页 > 解决方案 > 远程分支文件和本地文件的比较

问题描述

我可以git diff将远程分支中的文件与任何 git 存储库之外的本地文件系统上的文件进行比较吗?我想在不创建任何临时文件的情况下完成此操作。

git diff origin/release/1.0.1:pom.xml /tmp/pom.xml
error: Could not access 'origin/release/1.0.1:pom.xml'

这是不正确的,因为该文件存在于该分支中

但如果运行以下命令:

git diff origin/release/1.0.1:pom.xml -- /tmp/pom.xml
fatal: /tmp/pom.xml '/tmp/pom.xml' is outside repository

这个错误更容易理解

我已阅读帮助

git help diff

但没有找到任何与此案相关的有用信息。可能吗?

作为一种解决方法,我使用:

vimdiff <(git show origin/release/1.0.1:pom.xml) <(cat /tmp/pom.xml)

我使用git 版本 2.17.1

标签: git

解决方案


您可以运行git diff <(git show origin/release/1.0.1:pom.xml) /tmp/pom.xml,除了git diff不喜欢不是实际文件的输入文件:

error: /tmp/sh-np.eK8qhl: unsupported file type

bash 中的<(...)语法是通过mkfifo在临时文件目录中创建命名管道 ( ) 文件、分离一个进程以写入命名管道,然后运行顶级命令来实现的。当顶级命令完成时,bash 删除命名管道并在进程仍在运行时终止该进程。

diff将从命名管道读取的普通工具和其他工具工作正常。但是,如果您想使用git diff,最好的办法就是创建一个临时文件,即使您不想这样做。最后使用一些 shell 脚本自动删除临时文件:

#! /bin/sh
rev=origin/release/1.0.1
path=pom.xml

TF=$(mktemp) || exit
trap "rm -f $TF" 0 1 2 3 15
git show $rev:$path > $TF || exit
git diff $TF /tmp/pom.xml

除了从mktemp创建临时文件到临时文件trap "rm -f $TF"生效的短暂时间之外,此脚本之外的所有方法都会自动清理它。(好吧,所有不涉及不可恢复地终止 shell 的方法。例如,shell 的一个kill -9或 OOM 终止将导致临时文件被留下。但同样的缺陷适用于命名管道<(...)语法。)


推荐阅读