Как просмотреть вывод 'git diff' с помощью моего предпочтительного инструмента сравнения / средства просмотра?

Я посмотрел и еще не нашел что-то для Django, как команда Rails Generate. У Django есть немного другая философия. Это дает вам инструменты, позволяющие делать вещи легко, но на самом деле не делает это за вас (кроме интерфейса администратора). По большому счету, я думаю, что все в порядке. Когда я использую строительные леса для рельсов, я не могу часто сохранять большую часть автогенерированных материалов. Когда я это сделаю, интерфейс администратора django, вероятно, также сработал бы и дал бы мне больше функциональности.

Вместо этого я предлагаю читать через шаг 4 учебника по Django , который вводит общие а затем глава 7 книги Джанго , в которой представлены формы. Вы должны быть терпеливыми в главе 7, потому что авторы думают, что вы хотите узнать мельчайшие детали о трудном пути, прежде чем они научат вас легкому пути. (попробуйте найти страницу для фразы django.forms)

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

727
задан smci 13 February 2018 в 23:12
поделиться

11 ответов

Начиная с Git1.6.3 можно использовать мерзавец difftool сценарий : см. мой ответ ниже .

<час>

май быть этим статья поможет Вам. Вот большие части:

существует два различных способа определить внешний различный инструмент.

первым является метод, который Вы использовали путем установки переменной GIT_EXTERNAL_DIFF. Однако переменная, как предполагается, указывает на полный путь исполняемого файла. Кроме того, исполняемый файл, определенный GIT_EXTERNAL_DIFF, назовут с фиксированным набором 7 аргументов:

path old-file old-hex old-mode new-file new-hex new-mode

, Поскольку большинство различных инструментов потребует различного порядка (и только некоторые) аргументов, необходимо будет, скорее всего, определить сценарий обертки вместо этого, который в свою очередь называет реальный различный инструмент.

второй метод, который я предпочитаю, к [1 144], настраивают внешний различный инструмент через "конфигурацию мерзавца" . Вот то, что я сделал:

1) Создают сценарий обертки "git-diff-wrapper.sh", который содержит что-то как [1 132]

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

, Как Вы видите, только второе ("старый файл") и пятый ("новый файл"), аргументы будут переданы различному инструменту.

2) Тип

$ git config --global diff.external <path_to_wrapper_script>

в командной строке, заменяющей путем к "git-diff-wrapper.sh", таким образом, Ваш ~/.gitconfig содержит

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

убедиться использовать правильный синтаксис для определения путей к сценарию обертки и различному инструменту, т.е. использованию вперед, разрезал вместо обратных косых черт. В моем случае я имею

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

в .gitconfig и

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

в сценарии обертки. Следите за запаздывающей "кошкой"!

(я предполагаю' | cat', необходим только для некоторых программ, которые не могут возвратить надлежащий или последовательный статус возврата. Вы могли бы хотеть попробовать без запаздывающей кошки, если Ваш различный инструмент имеет явный статус возврата)

(, Diomidis Spinellis добавляет в комментариях :

Эти cat команда требуется, потому что diff(1) , выходами по умолчанию с кодом ошибки, если файлы отличаются.
Мерзавец ожидает, что внешняя различная программа выйдет с кодом ошибки, только если произошла фактическая ошибка, например, если это исчерпывает память.
Путем передачи по каналу вывода git к [1 110] ненулевой код ошибки маскируется.
более эффективно, программа могла просто работать exit с и аргумент 0.)

<час>

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

377
ответ дан VonC 13 February 2018 в 23:12
поделиться

Введение

Для ссылки я хотел бы включать свое изменение в ответ VonC. Следует иметь в виду, что я использую версию MSys Мерзавца (1.6.0.2 в это время) с измененным ПУТЕМ и выполняю Мерзавца самим из Powershell (или cmd.exe), не оболочка Bash.

я представил новую команду, gitdiff. Выполнение этой команды временно перенаправляет git diff для использования визуальной различной программы по Вашему выбору (в противоположность решению VonC, которое делает это постоянно). Это позволяет мне иметь обоих функциональность разности Мерзавца по умолчанию (git diff), а также визуальная различная функциональность (gitdiff). Обе команды берут те же параметры, так например, к визуально различным изменениям в конкретном файле, который можно ввести

gitdiff path/file.txt

Установка

Примечание, которое $GitInstall используется в качестве заполнителя для каталога, где Мерзавец установлен.

  1. Создают новый файл, $GitInstall\cmd\gitdiff.cmd

    @echo off
    setlocal
    for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
    if "%HOME%"=="" @set HOME=%USERPROFILE%
    set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
    set GIT_PAGER=cat
    git diff %*
    endlocal
    
  2. Создают новый файл, $GitInstall\bin\git-diff-visual.cmd (замена [visual_diff_exe] заполнитель с полным путем к различной программе по Вашему выбору)

    @echo off
    rem diff is called by git with 7 parameters:
    rem path old-file old-hex old-mode new-file new-hex new-mode
    echo Diffing "%5"
    "[visual_diff_exe]" "%2" "%5"
    exit 0
    
  3. , Вы теперь сделаны. Выполнение gitdiff из репозитория Мерзавца должно теперь вызвать Вашу визуальную различную программу для каждого файла, который был изменен.

6
ответ дан Milan Gardian 13 February 2018 в 23:12
поделиться
  • 1
    Вы правы - I' ve просто попробовал его в плоскости irb (1.8.7), it' s в самом Ruby. Этому не предоставляют направляющие. Спасибо за исправление моей ошибки! – kikito 24 February 2012 в 11:45

Решение для мерзавца Windows/msys

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

  1. Создают пакетный файл для вызова различной программы, с аргументом 2 и 5. Этот файл должен быть где-нибудь в Вашем пути. (Если Вы не знаете, куда то есть, поместите его в c:\windows). Назовите его, например, "gitdiff.bat". Мой:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. Набор переменная среды для указания на пакетный файл. Например: GIT_EXTERNAL_DIFF=gitdiff.bat. Или через powershell путем ввода git config --global diff.external gitdiff.bat.

    важно не использовать кавычки или указать любую информацию о пути, иначе это не будет работать. Вот почему gitdiff.bat должен быть в Вашем пути.

Теперь при вводе "разности мерзавца" она вызовет внешнее различное средство просмотра.

12
ответ дан hitautodestruct 14 February 2018 в 09:12
поделиться

Вот командный файл, который работает для Windows - предполагается, что DiffMerge установлен в месте по умолчанию, обрабатывает x64, обрабатывает замену с обратным слешем по мере необходимости и имеет возможность установить себя. Должно быть легко заменить DiffMerge вашей любимой программой diff.

Для установки:

gitvdiff --install 

gitvdiff.bat:

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF
6
ответ дан 22 November 2019 в 21:30
поделиться

Начиная с версии git 1.6.3 существует " git difftool ", который вы можете настроить для использования вашего любимого графического инструмента сравнения. В настоящее время "из коробки" поддерживаются kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse и opendiff ; если инструмента, который вы хотите использовать, нет в этом списке, вы всегда можете использовать параметр конфигурации ' difftool. .cmd '.

«git difftool» принимает те же параметры, что и «git diff ".

40
ответ дан 22 November 2019 в 21:30
поделиться

Чтобы завершить мой предыдущий ответ на конфигурацию "diff.external" выше:

Как упомянул Якуб , Git1.6.3 представил git difftool , первоначально предложенный в сентябре 2008 г .:

USAGE = '[- tool = tool] [--commit = ref] [--start = ref --end = ref] [--no-prompt] [файл для объединения] '
(См. - extcmd в последней части этого ответа)

$ LOCAL содержит содержимое файла из начальная ревизия и $ REMOTE содержит содержимое файла в конечной ревизии.
$ BASE содержит содержимое файла в word

Это в основном git- mergetool модифицирован для работы с git index / worktree.

Обычно этот сценарий используется, когда у вас есть поэтапные или неустановленные изменения и вы хотите увидеть изменения в параллельном средстве просмотра различий (например, xxdiff , tkdiff и т. д.).

git difftool [<filename>*]

Другой вариант использования - это когда вы хотите видеть ту же информацию, но сравниваете произвольные коммиты (это та часть, где анализ revarg может быть лучше)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

Последний вариант использования это когда вы хотите сравнить свое текущее рабочее дерево с чем-то другим, кроме HEAD (например, тегом)

git difftool --commit=v1.0.0 [-- <filename>*]

Примечание: начиная с Git 2.5, достаточно git config diff.tool winmerge !
См. " git mergetool winmerge "

И , начиная с Git 1.7.11 , у вас есть опция - dir-diff ,для создания внешних инструментов сравнения, которые могут сравнивать две иерархии каталогов одновременно после заполнения двух временных каталогов, вместо запуска экземпляра внешнего инструмента один раз для каждой пары файлов.


До Git 2.5:

Практический случай для настройки difftool с помощью вашего пользовательского инструмента сравнения:

C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false

С Winmerge.sh, хранящимся в части каталога вашего PATH:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

Если у вас есть другой инструмент (kdiff3, P4Diff, ...), создайте другой сценарий оболочки и соответствующую директиву config difftool.myDiffTool.cmd .

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

Если у вас есть другой инструмент (kdiff3, P4Diff, ...), создайте другой сценарий оболочки и соответствующую директиву config difftool.myDiffTool.cmd .

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

Если у вас есть другой инструмент (kdiff3, P4Diff, ...), создайте другой сценарий оболочки и соответствующую директиву config difftool.myDiffTool.cmd .
Затем вы можете легко переключаться между инструментами с помощью конфигурации diff.tool .

У вас также есть эта запись в блоге Дейва для добавления других деталей.
(Или этот вопрос для параметров winmergeu )

Этот параметр интересен сценарием winmerge.sh : вы можете настроить его так, чтобы учитывайте особые случаи.

См., например, ответ Дэвида Марбла ниже для примера, который касается:

  • новых файлов в исходной или целевой
  • удалил файлов в исходной или целевой

Как Кем Мейсон упоминает в своем ответе , вы также можете избежать использования какой-либо оболочки, используя ] - extcmd option :

--extcmd=<command>

Укажите пользовательскую команду для просмотра различий. git-difftool игнорирует настроенные значения по умолчанию и запускает $ command $ LOCAL $ REMOTE , когда указана эта опция.

Например,

209
ответ дан 22 November 2019 в 21:30
поделиться

С новым git difftool , это так же просто, как добавить это в ваш файл .gitconfig :

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

Необязательно, также добавьте:

[difftool]
    prompt = false

Также ознакомьтесь с difffall , простым скриптом, который я написал для расширения раздражающего (IMO) поведения diff по умолчанию при открытии каждого из них последовательно.

Глобальный файл .gitconfig в Windows находится в % USERPROFILE% \. gitconfig

39
ответ дан 22 November 2019 в 21:30
поделиться

Для версии Linux о том, как настроить инструмент сравнения различий в версиях git до 1.6.3 (1.6.3 добавил difftool в git) , это отличный краткое руководство,

вкратце:

Шаг 1: добавьте это в свой .gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

Шаг 2: создайте файл с именем git_diff_wrapper, поместите его где-нибудь в свой $ PATH

#!/bin/sh

vimdiff "$2" "$5"
5
ответ дан 22 November 2019 в 21:30
поделиться

Я использую kompare в ubuntu:

sudo apt-get install kompare

Чтобы сравнить две ветви:

git difftool -t kompare <my_branch> master
0
ответ дан 22 November 2019 в 21:30
поделиться

В духе ответов на вопросы, которые несколько отличаются от заданных. Попробуйте следующее решение:

$ meld my_project_using_git

Meld понимает git и обеспечивает навигацию по последним изменениям.

109
ответ дан 22 November 2019 в 21:30
поделиться

Если вы делаете это через cygwin, вам может потребоваться использовать cygpath:

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`
9
ответ дан 22 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: