Сравнение файла удаленной ветки и локального файла - PullRequest
0 голосов
/ 05 марта 2020

Можно ли использовать git diff для сравнения файла в удаленной ветке с файлом в локальной файловой системе вне каких-либо репозиториев git? Я хочу выполнить sh без создания каких-либо временных файлов.

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

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете запустить 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 приведет к тому, что временный файл останется позади. Но этот же недостаток применим к именованной трубе <(...) синтаксис.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...