.gitattributes не имеет значения, пытаясь пропустить файлы при использовании git difftool - PullRequest
9 голосов
/ 30 сентября 2011

Я прочитал сайт Git Pro и прочитал несколько ответов в StackOverflow, но, к сожалению, я просто не могу заставить работать .gitattributes.

Всякий раз, когда я использую git difftool,он попытается отобразить разницу между двоичными файлами, такими как файлы изображений (PNG).

Я пробовал различные комбинации в моем файле .gitattributes, но всякий раз, когда я запускаю команду git difftool, он все равно пытается сравнить двоичные файлы.

В папке моего репозитория яhave:
.git
.gitattributes
[подкаталоги файлов моего проекта]

Я испробовал множество комбинаций фильтров для моего файла .gitattributes.Например:

*. Двоичный файл pbxproj
* .png двоичный файл

Или также:

*. Двоичный файл pbxproj -diff
* .png двоичный -diff

Четный:

*. Двоичный файл pbxproj
* .png двоичный файл
* .pbxproj -diff -difftool
* .png -diff -difftool

Каждый раз я просто добавляю свой файл .gitattributes в индекс и фиксирую его.Однако после этого, когда я запускаю свой git difftool, чтобы проверить мои различия между двумя ветвями, это происходит:

git difftool otherBranch HEAD

Просмотр: 'MyApp.xcodeproj / project.pbxproj 'Hit return to launch' diffmerge ':

Просмотр:' MyApp / Background1.png 'Hit return to launch' diffmerge ':

Почему это происходит?Как мне наконец установить файл .gitattributes должным образом, чтобы мне не приходилось просматривать различия для этих конкретных файлов?

Для дальнейшего изучения я использовал команду git check-attr следующим образом:
git check-attr binary MyApp/MainBackground.png

Вывод MyApp/MainBackground.png: binary: set ... Интересно, почему git difftool все еще заставляет меня просматривать diff!

Ответы [ 2 ]

7 голосов
/ 06 октября 2011

Похоже, это недостаток difftool.Если вы используете файл .gitattributes, как вы описали, то вывод «git diff» будет изменен, как и предполагалось, поэтому установка *.proj binary или *.proj -diff изменяет вывод git diff для любых файлов .proj на «бинарные файлы отличаются».Тем не менее, difftool никогда не смотрят на атрибуты.Я полагаю, что это потому, что difftool в основном вызывает тот же код, что и mergetool, и поддерживается слияние бинарных файлов (если только путем копирования одного поверх другого).Прикрепленный патч - это небольшое изменение в скрипте difftool-helper, которое должно заставить его пропускать файлы, для которых установлен двоичный атрибут.Вероятно, это что-то для списка рассылки git.

--- git-difftool--helper    2011-06-03 21:48:08.000000000 +0100
+++ /opt/git/libexec/git-core/git-difftool--helper  2011-10-06 13:17:55.000000000 +0100
@@ -56,6 +56,10 @@
    fi
 }

+if test $(git check-attr diff "$1" | sed 's/.*diff: //') = 'unset'; then
+   echo skip binary file "\"$1\""
+else
+
 if ! use_ext_cmd; then
    if test -n "$GIT_DIFF_TOOL"; then
        merge_tool="$GIT_DIFF_TOOL"
@@ -70,3 +74,4 @@
    launch_merge_tool "$1" "$2" "$5"
    shift 7
 done
+fi
1 голос
/ 08 ноября 2012

patthoyts s answer работал на меня.

Уловка для меня заключалась в том, чтобы выяснить, какую версию git-difftool--helper использовал git (MacPorts установил несколько версий)

Я использовал (с открытым difftool):

lsof | grep "git-difftool--helper"
...