Saya ingin git push origin
menyetel referensi upstream secara otomatis ketika saya mendorong cabang yang dibuat secara lokal untuk pertama kalinya.
Saya tahu tentang git push -u
, tetapi saya tidak ingin memikirkan apakah saya telah menggunakan -u
sebelumnya atau tidak atau menyetel referensi upstream. Dengan kata lain, saya ingin git push
secara otomatis mempengaruhi git push -u
setiap dorongan dari cabang yang belum memiliki upstream.
Apakah ini mungkin? Jika itu membutuhkan alias atau skrip utilitas, itu bagus.
push.default
danbranch.<name>.merge
di git-config (1) ?push.default
menetapkancurrent
- begitulah cara saya mengatakangit push origin
tanpa refspec atau upstream. Tetapi itu tidak membantu dengan secara otomatis mengatur upstream.Jawaban:
Anda dapat mengkonfigurasinya dengan
git config
menggunakangit config --global push.default current
.Dokumen: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault
sumber
git push origin
tanpa refspec atau upstream. Tetapi itu tidak membantu dengan secara otomatis mengatur upstream.push
, misalnya hanya satu pengembang di cabangnya, yang hanya mengedit satu salinan repo.Karena menurut saya ini tidak mungkin dilakukan menggunakan git config, inilah yang dapat Anda lakukan di bash:
Jika cabang saat ini memiliki cabang pelacakan jarak jauh, ia memanggil
git push
sebaliknyagit push -u
sumber
git config --global push.default current
.push.default=current
hanya membuat cabang di repositori jarak jauh dengan nama yang sama dengan cabang lokal, tetapi tidak mengatur cabang lokal untuk melacak cabang jarak jauh. Saya tidak yakin mengapa hal ini terjadi, tetapi perlu diingat.Catatan: fakta bahwa kebijakan push default baru "
simple
" bergantung pada cabang yang memiliki cabang upstream berarti:menyetel cabang upstream dipandang sebagai langkah sukarela, bukan langkah otomatis tersembunyi
Jadi membangun dari mechanicalfish 's jawaban , Anda dapat menentukan alias, dengan tanda kutip ganda kanan (
"
) lolos (\"
):Sc0ttyD mengusulkan di komentar alias berikut:
Dalam beberapa baris:
sumber
-u
opsi eksplisit ini ada, dan mengapa tidak ada konfigurasi untuk membuat opsi tersebut otomatis (karenanya alias).alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Saya punya masalah yang sama. Saya telah menemukan alias ini (.gitconfig)
[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"
Penggunaan:
git track
sekali per cabang baru (saat ini keluar). Kemudian tekan saja seperti biasa :)sumber
Jawaban oleh @VonC dan @Frexuz sangat membantu, tetapi kedua solusi mereka menghasilkan kesalahan bagi saya. Menggunakan kedua jawaban mereka, saya menyusun sesuatu yang berhasil untuk saya:
Ini menghasilkan eksekusi salah satu
git push -u origin $BRANCHNAME
ataugit push
, bergantung pada apakah upstreamnya (propertibranch.$BRANCHNAME.merge
) ditentukan.Memasukkan alias ini pada baris perintah akan membutuhkan kode pelolosan, jadi mungkin paling mudah menggunakan editor untuk memasukkan ke file yang benar (
$HOME/.gitconfig
(global),.git/config
(lokal), atau/etc/gitconfig
(sistem))sumber
git config --global -e
Saya memecahkan masalah ini dengan menggunakan skrip Bash sederhana ini. Ini tidak akan berfungsi pada cabang yang ada, tetapi jika Anda membuat semua cabang Anda dengan fungsi ini, Anda akan selalu mengatur cabang upstream Anda secara otomatis.
$ 1 mewakili argumen pertama yang Anda berikan setelahnya,
con
jadi ini seperti melakukan:... dengan hanya melakukan ini:
sumber
Jawaban singkat
Jika Anda benar-benar ingin eksplisit dan menggunakan
-u
opsi bila perlu, tetapi tidak ingin mengetik seluruhnya:Kemudian Anda dapat menggunakan alias berikut:
Dan cukup ketik:
Jawaban panjang
Biasanya, kebutuhan
-u
(singkatan untuk--set-upstream
) adalah ketika kita baru saja membuat cabang lokal baru dan melakukan, dan kita ingin mendorongnya ke atas. Repositori jarak jauh belum memiliki cabang baru, jadi kita perlu memberi tahu git untuk membuat dan melacak cabang jarak jauh sebelum mendorong komit. Ini hanya diperlukan untuk dorongan pertama di cabang. Berikut skenario tipikal:Secara pribadi, saya suka kebutuhan untuk menjelaskan secara eksplisit
git push -u
saat membuat cabang jarak jauh: ini adalah operasi yang cukup signifikan, berbagi cabang baru ke dunia.Namun, saya benci kita harus menulis secara eksplisit
git push -u origin foo
. Tidak hanya sulit untuk mengetik, tetapi yang lebih penting, ini cukup rawan kesalahan! Sangat mudah untuk membuat kesalahan saat mengetik nama cabang, dan cabang jarak jauh yang baru tidak akan memiliki nama yang sama dengan cabang lokal Anda! Dalam kebanyakan kasus, sebenarnya Anda ingin repositori upstreamorigin
, dan cabang upstream memiliki nama yang sama dengan cabang lokal Anda.Oleh karena itu, saya menggunakan alias berikut di my
.gitconfig
, yang merupakan bagian dari jawaban luar biasa yang diberikan oleh Mark :Sekarang, kita dapat melakukan hal berikut, yang masih eksplisit, tetapi tidak terlalu rentan terhadap kesalahan:
sumber
Secara sederhana:
sumber
git push -u
, tapi ...". Jadi ini tidak menjawab pertanyaan itu.Jika Anda ingin menggunakan fitur git built-in hanya dengan sedikit kemungkinan menekan tombol, cukup ketik:
$ git push -u o
tabH
tabdan pelengkapan otomatis akan memberi Anda
$ git push -u origin HEAD
Untuk mengaktifkan pelengkapan otomatis di OSX, atur
~/.git-completition.bash
file dengan konten ini dan tambahkan baris berikut ke~/.bash_profile
file Anda dan mulai ulang terminal Anda:Ini mempengaruhi terminal built-in juga, seperti yang ada di vscode dll.
sumber
git-completition.bash
dan menambahkan jawaban saya.Saya membuat ekstensi git dengan skrip yang berguna, termasuk yang ini:
https://github.com/jvenezia/git-line
sumber
Jika, karena alasan apa pun, tidak ada jawaban lain yang sesuai untuk Anda, maka Anda dapat mengganti
git push
dengan fungsi bash ini untuk mengirim ulang permintaan push secara otomatis dengan flag yang benar saat diperlukan.gitpush() { git push -v 2>&1 | # perform push command, pipe all output tee /dev/tty | # keep output on screen and pipe it forward ( cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p"); [[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd); ) # if we get output that matches the command to perform, execute it }
Anda akan mengorbankan bagian kemajuan dari keluaran push, tetapi selain itu semuanya berfungsi seperti yang diharapkan.
Secara pribadi, saya akan menggunakan jawaban JT Jobe .
sumber