Можно ли настроить папку временных файлов в git diff?

При звонке git difftool в репозитории git сравнивает измененные файлы в локальном репозитории с их соответствием на удаленном компьютере. Для этого он создает временный файл для удаленного, устанавливает переменные LOCAL а также REMOTE и вызывает тот инструмент, который указан для diff в конфиге git.

По умолчанию временный файл создается в /tmp/<hash>_filename, Можно ли изменить это местоположение по умолчанию?

Почему ты бы так поступил?

Короче говоря, я использую git через подсистему windows для linux и хочу использовать инструмент windows для различий и слияния. Проблема в, /tmp недоступен со стороны Windows, поэтому мне нужно переместить папку по умолчанию, где git создает временные файлы, куда-то доступный для Windows.

Что я пробовал:

Пока что все, что я мог найти, это предложение sudo mount -B /tmp /mnt/c/tmp но это не похоже на работу (/tmp по-прежнему указывает на тот же каталог, что и раньше...)

5 ответов

Решение

Вы можете попробовать установить TMPDIR переменная окружения.

Из руководства POSIX:

TMPDIR Эта переменная должна представлять путь к каталогу, доступному для программ, которым требуется место для создания временных файлов.


После быстрого просмотра кода git (git/builtin/difftool.c), Я не думаю, что настройка временного каталога в настоящее время поддерживается:

/* Setup temp directories */
tmp = getenv("TMPDIR");
xsnprintf(tmpdir, sizeof(tmpdir), "%s/git-difftool.XXXXXX", tmp ? tmp : "/tmp");

Похоже, мерзавец принимает TMPDIR значение или "/tmp", если TMPDIR не определено.

По умолчанию временный файл создается в /tmp/<hash>_filename.
Можно ли изменить это местоположение по умолчанию?

Не совсем так, но это расположение по умолчанию было изменено в Git 2.37 (3 квартал 2022 г.): временные файлы, передаваемые внешней команде, теперь создаются внутри нового временного каталога с тем же базовым именем.

См. , (20 апреля 2022 г.) Рене Шарфе ( rscharfe).
(Объединено Junio ​​C Hamano -- gitster-- в коммите 2e96975, 20 мая 2022 г.)

коммит 8af7593: использовать

Подписал: Рене Шарф

Git использует временные файлы для передачи содержимого больших двоичных объектов внешним программам и textconvфильтры.
Он призывает создать их, что помещает их все в один и тот же каталог.
Это требует добавления случайного префикса имени.

Вместо этого используйте , что позволяет файлам иметь произвольные имена, каждый в своем отдельном временном каталоге.
Таким образом, они могут иметь то же базовое имя, что и исходный большой двоичный объект, что выглядит лучше в графических программах сравнения.

А также:

коммит 2c2db19tempfile: добавлять mks_tempfile_dt()

Подписал: Рене Шарф

Добавьте функцию для создания временного файла с определенным именем во временном каталоге, созданном с помощью mkdtemp(3).
Его результат красивее, чем пути, созданные mks_tempfile_ts(), которые включают случайный префикс.
Это полезно для файлов, переданных в программу, которая отображает их имя, например, внешний diffинструмент.

Та же проблема, решение не путем изменения временного каталога git, а с помощью сценария diff, который вы можете определить:

  1. Определить скрипт для сравнения в .gitconfig

    [diff]
    external = /home/user/scripts/my_diff.sh
    
  2. Создать скрипт /home/user/scripts/my_diff.sh использовать инструмент Windows:

    #!/bin/bash
    FILE2="C:\\dev\\wsl\\Debian\\rootfs\\${2//\//\\}"
    FILE1=$(wslpath -w $5)
    /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe $FILE1 $FILE2
    

В моем примере я использую WinMerge.
Я знаю, что это решение противоречит правилу, согласно которому инструментам Windows не разрешается трогать файлы Linux, но я согласен с этим, поскольку мы говорим о временном файле, и я не вижу смысла менять его в WinMerge. Замена пути вручную необходима, потому что wslpath не работает на внутреннем пути Linux.

Ваш WSL может быть другим, обычно где-то

C:\Users\%username%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs

Это кажется немного хакерским, но я им пользуюсь и счастлив до сих пор.

Поместите это в свой.gitconfig в каталог windows/HOME. Вам нужно будет установить cygwin для команд cygpath (и git) и настроить расположение WinMerge ниже.

[difftool "winmerge"]
         # Usage: git difftool --tool winmerge
        path = C:/bin/WinMergeU.exe
        cmd =  C:/bin/WinMergeU.exe \"$(cygpath -wam $LOCAL)\" \"$(cygpath -wam $REMOTE)\"

Я сделал вариант двух подходов здесь, для собственного использования. Я создал скрипт, который я вызываю вместо запуска git diff (измените путь "twm", если копируете - это мой собственный каталог пользователя):

#!/bin/bash                                                                     

export TMPDIR=$( realpath --relative-to=. /mnt/c/Users/twm/tmp )
git difftool -y -t winmerge "$@"

Я специально предназначался для WinMerge, вызванного Git, работающим в подсистеме Windows для Linux. Проблема, с которой я столкнулся при использовании TMPDIR, заключалась в том, что в то время, когда Git записывал в него, WinMerge не распознавал временный путь, первоначально потому, что он начинался с "/mnt/c" - я получил пути для сопоставления между WSL и Windows, за исключением ведущий "c:" и WinMerge все еще не узнали его. Однако я заметил, что другой путь был правильно распознан, и ps показал, что он передается в WinMerge как относительный путь, поэтому я использовал realpath сделать TMPDIR относительным тоже.

Использование сценария для локальной настройки TMPDIR также решает проблему, упомянутую в комментариях. То есть изменение временного каталога для всех других программ для этого варианта использования кажется излишним и может иметь некоторые непреднамеренные побочные эффекты.

Подобно второму подходу, перечисленному здесь, я тоже использовал псевдонимы Git, пытаясь заставить это работать. Однако я хотел использовать существующую интеграцию WinMerge в Git на тот случай, если встроенная интеграция предоставляет больше функциональных возможностей, чем жестко запрограммированный скрипт, сейчас или в будущем.

Другие вопросы по тегам