Usando apenas bash
, diff
, tput
, e less
, podemos aproximar de perto a saída git diff
. Haverá algumas diferenças notáveis, porém, devido à miopia dos diff
programadores.
Coloque a seguinte definição de função Bash em algum arquivo obtido automaticamente pela sua conta de usuário e você poderá acessar a função na linha de comando:
function gdiff()
{
local REG=`tput op`
local GRP=`tput setaf 6`
local ADD=`tput setaf 2`
local REM=`tput setaf 1`
local NL=$'\n'
local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"
local UNCH_GRP_FMT=''
[[ "${1}" == '@full' ]] && {
UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
shift
}
diff \
--new-line-format="${ADD}+%L${REG}" \
--old-line-format="${REM}-%L${REG}" \
--unchanged-line-format=" %L${REG}" \
--new-group-format="${GRP_LABEL}${NL}%>" \
--old-group-format="${GRP_LABEL}${NL}%<" \
--changed-group-format="${GRP_LABEL}${NL}%<%>" \
--unchanged-group-format="${UNCH_GRP_FMT}" \
"${@}" | less -FXR
}
Esta função funciona da seguinte maneira:
- Por fim,
diff
é chamado com várias opções de formatação para especificar como as alterações nos arquivos serão exibidas.
tput
é usado para inserir códigos de cores ANSI nessas opções de formatação. Observe que, ao usar terminais não-ANSI, talvez seja necessário substituí-lo tput setaf
por tput setf
.
- A saída de
diff
é canalizada para less
. -R
permite que as cores ANSI sejam preservadas. -X
impede less
de limpar a tela ao sair. -F
impede a less
operação como pager se a saída couber em uma tela.
- Se o primeiro parâmetro for
@full
, a função exibirá todas as linhas inalteradas, além das linhas adicionadas e removidas.
Observe as seguintes diferenças entre essa abordagem e git diff
:
git diff
relata três linhas de contexto em torno de cada alteração. Infelizmente, diff
parece reclamar e sair se você quiser especificar o número de linhas de contexto e ao mesmo tempo especificar opções de formatação. (Pelo menos no Mac OS X Yosemite). Obrigado diff
programadores. Portanto, você pode solicitar nenhuma linha de contexto ao redor de cada alteração, que é o comportamento padrão, ou pode solicitar que todas as linhas inalteradas no arquivo também sejam relatadas, especificando @full
como o primeiro parâmetro.
- Como as linhas de contexto são diferentes
git diff
, os números de linhas relatados por esta função também variam dos informados por git diff
.
- Você pode ver a presença de alterações de linha única relatadas, que é o comportamento correto, mas irritante quando o arquivo alterado contém a inserção de linhas vazias únicas. Eu acho que
git diff
lida melhor com isso, através de suas linhas de contexto. Você pode tentar passar opções diferentes diff
para lidar melhor com espaços em branco, se preferir.
newtext
no/etc/colordiff
. Eu acho que o git usa verde?