вторник, 9 июня 2009 г.

Ошибка "trailing whitespace" при коммите в git

Git, как и некоторые другие SCM, например Mercurial, следят за некоторой чистотой кода и проверяют невидимые символы в конце строк.
Эти символы являются мусором и не несут какой-либо полезной информации.
Поэтому, если по команде:
$ git svn rebase
выдается ошибка подобная:
/какой-то_путь/.git/rebase-apply/patch:61: trailing whitespace.
using System.Collections.Generic;
То правильным решением будет открыть эти строки и убрать лишние служебные символы.
Например это можно сделать в интерактивном режиме:
git svn rebase -i
Если во время работы случится что-то непредвиденное и Git начнет сыпать:
Interactive rebase already started
То это легко лечится:
git rebase --continue
Допустим, время или желание не позволяют наводить красоту, то возможно добавить исключение, после чего Git будет пропускать такие ошибки в будущем:
git config core.whitespace nowarn

Включение поддержки UTF-8 в cygwin 1.7

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

На многих форумах пишут что для версий меньше 1.7 проблема актуальна, но я сам не проверял. Для сборки 1.5.25-15 существует специальный патч.
Который, судя по всему, был включен в основную ветку.

Итак, чтобы включить поддержку кодировки UTF-8 необходимо проделать следующие шаги:

1. Если ставите CygWin заново, то отметьте в инсталляторе пакеты интернационализации
libintl, libiconv2. Либо просто убедитесь в их наличии при уже установленном CygWin
2. Добавьте или приведите к следующему виду строки в файле /etc/inputrc или ~/.inputrc:
set input-meta on
set meta-flag on
set convert-meta off
set output-meta on

3. Добавьте или приведите к следующему виду строку в файле /etc/profile или ~/.profile:
export LANG=ru_RU.UTF-8

Или же можно создать отдельный файлик локализации в папке /etc/profile.d/. Пусть это будет, например utf-8.sh.

А теперь запускаем CygWin и видим нормальную поддержку русского языка.
В частности, теперь нормально работает git, особенно git svn rebase.

Для некоторых задач удобно использовать GitExtensions. Это довольно неплохая утилита, аналогичная TortoiseGit, но поддерживает совместную работу с Visual Studio 2005, 2008.
Первая проблема - утилита требует файл git.cmd, которого в CygWin нет. Берем его из MSysGit и кладем в c:\cygwin\cmd.
Вторая, в том, что git.cmd не учитывает свойства среды, которые мы настроили ранее, поэтому я немного подправил его до такого вида:

@echo off
set PLINK_PROTOCOL=ssh
setlocal
for /F "delims=" %%I in ("%~dp0") do @set git_install_root=%%~fI
rem set git_install_root=C:\cygwin
set path=%git_install_root%\bin;%git_install_root%\cmd;%PATH%

if "%1"=="gui" @goto gui
:default
for /f "tokens=* usebackq" %%i in (`@cygpath.exe %CD%`) do (
set HOME=%%i
)
bash.exe -lc 'git.sh --git-dir=%HOME%/.git %*'
exit /b %ErrorLevel%
:gui
if "%2"=="citool" @goto default
start wish.exe "%git_install_root%\libexec\git-core\git-gui" -- %2 %3 %4 %5 %6 %7 %8 %9


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