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 diffprogramadores.
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 setafpor tput setf.
- A saída de
diffé canalizada para less. -Rpermite que as cores ANSI sejam preservadas. -Ximpede lessde limpar a tela ao sair. -Fimpede a lessoperaçã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 diffrelata três linhas de contexto em torno de cada alteração. Infelizmente, diffparece 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 diffprogramadores. 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 @fullcomo 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 difflida melhor com isso, através de suas linhas de contexto. Você pode tentar passar opções diferentes diffpara lidar melhor com espaços em branco, se preferir.
newtextno/etc/colordiff. Eu acho que o git usa verde?