Можно ли настроить папку временных файлов в 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
фильтры.
Он призывает создать их, что помещает их все в один и тот же каталог.
Это требует добавления случайного префикса имени.Вместо этого используйте , что позволяет файлам иметь произвольные имена, каждый в своем отдельном временном каталоге.
Таким образом, они могут иметь то же базовое имя, что и исходный большой двоичный объект, что выглядит лучше в графических программах сравнения.
А также:
коммит 2c2db19
tempfile
: добавлятьmks_tempfile_dt()
Подписал: Рене Шарф
Добавьте функцию для создания временного файла с определенным именем во временном каталоге, созданном с помощью
mkdtemp
(3).
Его результат красивее, чем пути, созданныеmks_tempfile_ts()
, которые включают случайный префикс.
Это полезно для файлов, переданных в программу, которая отображает их имя, например, внешнийdiff
инструмент.
Та же проблема, решение не путем изменения временного каталога git, а с помощью сценария diff, который вы можете определить:
Определить скрипт для сравнения в
.gitconfig
[diff] external = /home/user/scripts/my_diff.sh
Создать скрипт
/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 на тот случай, если встроенная интеграция предоставляет больше функциональных возможностей, чем жестко запрограммированный скрипт, сейчас или в будущем.