Можно ли настроить папку временных файлов в git diff? - PullRequest
0 голосов
/ 09 мая 2018

При вызове 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 по-прежнему указывает на тот же каталог, что и раньше ...)

Ответы [ 3 ]

0 голосов
/ 13 января 2019

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

  1. Определение сценария для diff в .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

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

0 голосов
/ 20 января 2019

Я сделал вариант двух подходов здесь, для собственного использования. Я создал скрипт, который я вызываю вместо запуска 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 на тот случай, если встроенная интеграция предоставляет больше функциональных возможностей, чем жестко запрограммированный скрипт, сейчас или в будущем.

0 голосов
/ 09 мая 2018

Вы можете попробовать установить переменную окружения 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");

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

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