Hanya menggunakan bash, diff, tput, dan less, kita dapat erat mendekati output git diff. Akan ada beberapa perbedaan penting, karena kurangnya perhatian para diffprogrammer.
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,
diffakan dipanggil dengan berbagai opsi pemformatan untuk menentukan bagaimana perubahan dalam file akan ditampilkan.
tputdigunakan untuk menyisipkan kode warna ANSI ke dalam opsi pemformatan tersebut. Perhatikan bahwa saat menggunakan terminal non-ANSI, Anda mungkin harus mengganti tput setafdengan tput setf.
- Output dari
diffdisalurkan ke less. -Rmemungkinkan warna ANSI dipertahankan. -Xmencegah lessdari membersihkan layar saat keluar. -Fmencegah lessberoperasi 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 diffmelaporkan tiga baris konteks seputar setiap perubahan. Sayangnya, difftampaknya 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 diffprogrammer. 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 @fullsebagai 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 diffberurusan dengan ini lebih baik, melalui garis konteksnya. Anda dapat mencoba melewati opsi yang berbeda diffuntuk menangani ruang putih dengan lebih baik, jika Anda mau.
newtextdalam/etc/colordiff. Saya pikir git menggunakan hijau?