Вы можете запустить 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
, лучше всего создать временный файл, даже если вы этого не хотите. Используйте немного сценария оболочки для автоматического удаления временного файла в конце:
#! /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"
все пути из этого скрипта автоматически очистят его. (Ну, все способы, которые не включают уничтожение оболочки безвозвратно. Например, уничтожение оболочки kill -9
или OOM приведет к тому, что временный файл останется позади. Но этот же недостаток применим к именованной трубе <(...)
синтаксис.)