Mengatur flag default git pada perintah

89

Saya ingin tahu apakah ada cara untuk menyetel bendera secara default untuk perintah git. Secara khusus, saya ingin menyetel --abbrev-commitbendera sehingga saat mengeksekusi git log, saya ingin mengeksekusi git log --abbrev-commit.

Tidak seperti pertanyaan " adakah cara untuk menyetel flag secara default untuk perintah git? ", Tampaknya tidak ada flag konfigurasi untuk menambahkan --abbrev-commit ke git log. Lebih lanjut, git manual menyatakan bahwa saya tidak dapat membuat alias: "Untuk menghindari kebingungan dan masalah dengan penggunaan skrip, alias yang menyembunyikan perintah git yang ada akan diabaikan"

Pilihan ketiga saya adalah menciptakan alias baru seperti glog=log --abbrev-commitdi file .gitconfig saya. Tapi saya lebih suka tidak menciptakan DSL saya sendiri dengan perintah baru.

Apakah ada cara lain untuk mencapainya sehingga abbrev-commitbendera disetel secara default ??

Jesper Rønn-Jensen
sumber
1
Mulai git 1.7.6 ada sebuah flag untuk mengontrol perilaku ini. Lihat jawabannya oleh @underrun di bawah ini.
slacy

Jawaban:

59

Sejak git versi 1.7.6, git config telah mendapatkan opsi log.abbrevCommit yang dapat disetel ke true. Jadi jawabannya adalah upgrade ke setidaknya 1.7.6 (saat ini saat tulisan ini dibuat adalah 1.7.11.4) dan gunakan:

git config --global log.abbrevCommit true
underrun
sumber
2
Bukankah ada pilihan untuk oneline?
Zaz
1
Saya menerima jawaban ini. Senang melihat Git menambahkan konfigurasi ini sejak saya menulis pertanyaan hampir empat tahun lalu.
Jesper Rønn-Jensen
Dari manakah sumber dari semua pilihan mistik ini?
xaxxon
Adakah yang tahu bendera default untuk grafik? Saya tidak dapat menemukannya di halaman @xaxxon tertaut ..
myol
@myol, Anda harus menggunakan git config --helpatau git help configmendapatkan dokumentasi yang cocok dengan instalasi Anda .
doak
46

Anda dapat menggunakan format kustom untuk git logmeniru --abbrev-commitsecara default:

git config format.pretty "format:%h %s"
dahlbyk.dll
sumber
Bagus, ini adalah jawaban terbaik dengan mudah.
duane
Anda juga dapat menggunakan warna saat memformat: "% C (kuning)% h% Creset% s" akan muncul seperti git log --oneline dengan warna.
Avner
1
Sekarang pertanyaan singkat: jika Anda menemukan ini berguna dan ini menjawab masalah dengan tepat, mengapa Anda tidak menandai ini sebagai benar?
igorsantos07
1
Ini lebih baik jika Anda tidak ingin mengingat alias yang tidak jelas atau sulit diingat dan lebih suka menggunakan "git log" setiap saat.
Shyam Habarakada
1
Ini adalah jawaban terbaik untuk saya. The log.abbrevCommitPengaturan mempengaruhi lebih lainnya verbose format, yang saya tidak suka. Juga, gunakan %C(auto)%h %suntuk mendapatkan format oneline normal dengan pewarnaan otomatis. Saya menggunakan git config --global format.pretty "%C(auto)%h %d %s"karena saya ingin didekorasi secara oneline sebagai "default" saya
davenpcj
34

Tidak ada mekanisme umum di git untuk menyetel argumen default untuk perintah.

Anda dapat menggunakan alias git untuk menentukan perintah baru dengan argumen yang diperlukan:

git config alias.lg "log --oneline"

Lalu kamu bisa lari git lg.

Beberapa perintah juga memiliki pengaturan konfigurasi untuk mengubah perilakunya.

hasen
sumber
12
Saya ingin menghindari membuat sintaks saya sendiri jadi saya lebih suka solusi di mana saya tidak menggunakan git lgtetapigit log
Jesper Rønn-Jensen
Mengapa? apa bedanya?
hasen
46
Perbedaan yang sangat penting adalah saya tidak ingin memperkenalkan "sintaks git Jespers" di sistem saya. Saya ingin saya (dan orang lain menggunakan mesin saya) untuk menggunakan perintah umum. Selain itu, ini akan membuat pekerjaan saya lebih cepat di komputer lain: Saya tidak khawatir tentang tidak sengaja mengetik "git lg" dan mendapatkan kesalahan "tidak ditemukan"
Jesper Rønn-Jensen
19
Jika orang lain menggunakan mesin Anda dan mengetik git log, solusi yang Anda maksudkan berarti mereka akan mendapatkan hasil yang tidak mereka harapkan.
Abizern
1
Mendefinisikan ulang alias standar dapat merusak skrip.
Tepat
10

VonC telah mengisyaratkan pembungkus shell dalam jawabannya; berikut adalah implementasi Bash saya untuk pembungkus seperti itu. Jika Anda memasukkan contoh ini ke dalam .bashrcshell interaktif Anda akan mendukung penggantian perintah bawaan Git serta alias huruf besar.

# Git supports aliases defined in .gitconfig, but you cannot override Git
# builtins (e.g. "git log") by putting an executable "git-log" somewhere in the
# PATH. Also, git aliases are case-insensitive, but case can be useful to create
# a negated command (gf = grep --files-with-matches; gF = grep
# --files-without-match). As a workaround, translate "X" to "-x". 
git()
{
    typeset -r gitAlias="git-$1"
    if 'which' "$gitAlias" >/dev/null 2>&1; then
        shift
        "$gitAlias" "$@"
    elif [[ "$1" =~ [A-Z] ]]; then
        # Translate "X" to "-x" to enable aliases with uppercase letters. 
        translatedAlias=$(echo "$1" | sed -e 's/[A-Z]/-\l\0/g')
        shift
        "$(which git)" "$translatedAlias" "$@"
    else
        "$(which git)" "$@"
    fi
} 

Anda kemudian dapat menimpa git logdengan meletakkan skrip bernama di git-logsuatu tempat ke PATH Anda:

#!/bin/sh
git log --abbrev-commit "$@"
Ingo Karkat
sumber
7

Saya memiliki masalah serupa (banyak dari opsi default untuk perintah Git bodoh). Inilah pendekatan saya. Buat skrip bernama 'grit' (atau apa pun) di jalur Anda, sebagai berikut:

#!/bin/bash
cmd=$1
shift 1
if [ "$cmd" = "" ]; then
  git
elif [ $cmd = "log" ]; then
  git log --abbrev-commit $@
elif [ $cmd = "branch" ]; then
  git branch -v $@
elif [ $cmd = "remote" ]; then
  git remote -v $@
else
  git $cmd $@
fi

Sangat mudah dibaca dan dikelola, jika Anda ingin membagikannya dengan non-ahli Bash.

Steve Bennett
sumber
Anda yakin ingin "git remote blah" memanggil "git branch blah"? Saya menggunakan varian ini di mana saya meletakkan git sebelumnya di jalur dan kemudian secara eksplisit memanggil / usr / bin / git di skrip saya. Ya ini mungkin merusak sesuatu.
LovesTha
1
Saya menyukai ini dan membuat dua penyesuaian tambahan. Saya membuat fungsi bash dan biarkan diberi nama gitdengan menambahkan baris pertama untuk mendapatkan jalur perintah nyata: thegit=`/usr/bin/which git`. Dan saya menambahkan opsi untuk membatalkan menimpa dengan x sebelum perintah seperti git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg
0

Setiap utilitas yang kami gunakan (svn, maven, git, ...) selalu dikemas dalam .bat (di Windows, atau .sh di Unix), untuk menawarkan kepada pengembang kami satu direktori untuk ditambahkan ke jalur mereka.

Jika git dienkapsulasi dalam skrip pembungkus, maka ... semuanya mungkin.

Tetapi itu tetap merupakan solusi yang ditautkan ke pengaturan pengguna, tidak ditautkan ke Git itu sendiri atau repo git.

VonC
sumber
Jadi maksud Anda saya harus bisa mencapainya dengan menambahkan alias ke .bash_profile saya?
Jesper Rønn-Jensen
@Jesper: itulah idenya, karena pembungkus Anda git.bat akan dapat mendeteksi perintah Git apa yang ingin Anda jalankan dan dapat menambahkan opsi apa pun yang diinginkan.
VonC