Hanya menggunakan bash
, diff
, tput
, dan less
, kita dapat erat mendekati output git diff
. Akan ada beberapa perbedaan penting, karena kurangnya perhatian para diff
programmer.
Masukkan definisi fungsi Bash berikut dalam beberapa file yang bersumber secara otomatis oleh akun pengguna Anda, dan Anda akan dapat mengakses fungsi dari baris perintah:
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
}
Fungsi ini berfungsi sebagai berikut:
- Pada akhirnya,
diff
akan dipanggil dengan berbagai opsi pemformatan untuk menentukan bagaimana perubahan dalam file akan ditampilkan.
tput
digunakan untuk menyisipkan kode warna ANSI ke dalam opsi pemformatan tersebut. Perhatikan bahwa saat menggunakan terminal non-ANSI, Anda mungkin harus mengganti tput setaf
dengan tput setf
.
- Output dari
diff
disalurkan ke less
. -R
memungkinkan warna ANSI dipertahankan. -X
mencegah less
dari membersihkan layar saat keluar. -F
mencegah less
beroperasi sebagai pager jika output cocok dalam satu layar.
- Jika parameter pertama adalah
@full
, fungsi akan menampilkan semua baris yang tidak berubah selain baris yang ditambahkan dan dihapus.
Perhatikan perbedaan berikut antara pendekatan ini dan git diff
:
git diff
melaporkan tiga baris konteks seputar setiap perubahan. Sayangnya, diff
tampaknya mengeluh dan keluar jika Anda ingin menentukan jumlah baris konteks sementara juga secara bersamaan menentukan opsi pemformatan. (Setidaknya itu di Mac OS X Yosemite). Terima kasih diff
programmer. Oleh karena itu, Anda dapat meminta tidak ada baris konteks di sekitar setiap perubahan, yang merupakan perilaku default, atau Anda dapat meminta agar semua baris yang tidak berubah dalam file juga dilaporkan, dengan menetapkan @full
sebagai parameter pertama.
- Karena garis konteks berbeda dari
git diff
, nomor baris yang dilaporkan oleh fungsi ini juga akan berbeda dari yang dilaporkan oleh git diff
.
- Anda mungkin melihat adanya perubahan satu baris yang dilaporkan, yang merupakan perilaku yang benar, tetapi menjengkelkan ketika file yang diubah berisi penyisipan satu baris kosong. Saya pikir
git diff
berurusan dengan ini lebih baik, melalui garis konteksnya. Anda dapat mencoba melewati opsi yang berbeda diff
untuk menangani ruang putih dengan lebih baik, jika Anda mau.
newtext
dalam/etc/colordiff
. Saya pikir git menggunakan hijau?