Mengubah standar 'push to' remote Git


228

Saya ingin mengubah tujuan cabang jarak jauh default Git sehingga saya bisa saja

git push

Dari pada:

git push upstream

Saat ini diatur ke remote asal dan saya ingin mengaturnya ke remote lain.

Saya mencoba untuk menghapus remote asli (kloning dari)

git remote rm origin

Yang tidak menghapus remote asli. Tetapi tidak memecahkan git pushmasalah. Saya masih mendapatkan:

fatal: Tidak ada tujuan push yang dikonfigurasi. Tentukan URL dari baris
perintah atau konfigurasikan repositori jarak jauh menggunakan ...

Saya juga mencoba bermain dengan:

git remote set-url --push myfork origin

dan opsi lain tetapi sepertinya tidak ada yang berhasil (mungkin karena saya terlalu cepat menghapus asal-usulnya?)

Mengikuti jawaban di sini saya mencoba untuk mengubah:

git config push.default upstream (or matching)

tapi tidak ada yang berhasil.

Jawaban:


215

Anda dapat menggunakan git push -u <remote_name> <local_branch_name>untuk mengatur hulu default. Lihat dokumentasi untuk push git untuk lebih jelasnya.


1
Tidak berfungsi: Saya mendapatkan '' 'fatal:' origin 'tampaknya tidak menjadi tempat penyimpanan git fatal: Ujung remote tiba-tiba menutup' '' mungkin karena saya menghapus asal remote sebelum pindah. baru saja menemukan solusi yang berfungsi, saya akan memperbarui dalam jawaban
alonisser

34
Sebagai klarifikasi tambahan, sintaks seharusnya git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>.
Marco Lazzeri

33
Contoh: git push -u origin master:master.
starbeamrainbowlabs

1
Setelah mengatur remote default ... bukankah ada yang bisa Anda paksa git pushuntuk mendorong cabang remote dari cabang lokal saat ini? Maksud saya melakukannya ini berarti saya harus menjalankan perintah ini untuk setiap cabang. Baik? Tidak bisakah saya hanya melakukan pengaturan awal untuk seluruh repo? @MarcoLazzeri
Honey

2
@ starbeamrainbowlabs Tidak git push -u origin mastercukup? Apakah Anda hanya mengilustrasikan sintaksis lengkap?
Josiah Yoder

108

Untuk mengubah remote upstream mana yang "kabel" ke cabang Anda, gunakan git branchperintah dengan flag konfigurasi upstream.

Pastikan remote ada terlebih dahulu:

git remote -vv

Setel jarak jauh yang disukai untuk cabang saat ini (dicentang):

git branch --set-upstream-to <remote-name>

Memvalidasi cabang diatur dengan remote upstream yang benar:

git branch -vv


2
Baru saja mencoba git branch --set-upstream-to myforkdan mendapat kesalahan:> error: opsi tidak diketahui `set-upstream-to 'Saya menjalankan git 1.7.9
alonisser

3
Sintaks berubah dalam 1,8, lihat stackoverflow.com/questions/520650/…
jtniehof

1
Lihat jawaban berikut: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

10
git branch -u <remotename>/<branch>bekerja untukku. Perintah dijalankan dengan cabang lokal yang menarik diperiksa. Lihat 'Melacak Cabang' di git-scm.com/book/it/v2/Git-Branching-Remote-Branches
norio

2
Output perintah jarak jauh verbose benar-benar adil git remote -vatau git remote --verbose. The -vv's ekstra v adalah berlebihan.
Artif3x

45

Bekerja dengan Git 2.3.2 ...

git branch --set-upstream-to myfork/master

Sekarang status, pushdan pulldiarahkan ke myforkremote


Ini berfungsi ketika Anda hanya ingin mengatur default pulljuga.
StingyJack

39

Anda dapat dengan mudah mengubah remote default untuk cabang sekaligus sekaligus menggunakan perintah ini

git push -u <remote_name> --all

14
Sekadar diketahui, ini akan mendorong mereka semua, serta mengubah remote upstream mereka.
poolie

16

Jika Anda melakukannya git push origin -u localBranchName:remoteBranchNamedan pada git pushperintah berurutan , Anda mendapatkan kesalahan yang kemudian asal tidak ada, kemudian ikuti langkah-langkah ini:

  1. git remote -v

Periksa apakah ada remote yang tidak saya pedulikan. Hapus dengangit remote remove 'name'

  1. git config --edit

Cari tanda-tanda kemungkinan remote lama / tidak ada. Mencari pushdefault:

[remote]
  pushdefault = oldremote

Perbarui oldremotenilai dan simpan.

git push harus bekerja sekarang.


2
Terima kasih! Saya cenderung menambahkan -uketika menggunakan git pushke remote yang berbeda karena memori otot. Ini menjadikan remote yang diberikan sebagai default, mengaturnya menggunakan kembaligit config --edit (atau mendorong lagi dan mengatur remote baru) menyelesaikan masalah.
Tim Visée

13

Hanya klarifikasi (menggunakan git versi 1.7.9.5 di ubuntu 12.04):

Git akan menambah / menghapus remote. Ini adalah contoh git dari jarak jauh dengan server terpasang.

git remote add myremote git://remoteurl

Anda kemudian dapat mengambil repositori git seperti:

git fetch myremote

Tampaknya ini membuat cabang bernama 'myremote', namun remote untuk cabang tidak diatur secara otomatis. Untuk melakukan ini, Anda harus melakukan hal berikut:

Pertama, verifikasi bahwa Anda memiliki masalah ini, yaitu

git config -l | grep myremote

Anda harus melihat sesuatu seperti:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

Jika Anda melihat branch.myremote.remote=., maka Anda harus melanjutkan:

git config branch.myremote.remote myremote
git checkout myremote
git pull

Anda sekarang harus mengetahui repositori jarak jauh, dan tarikan / dorongan Anda harus diikat ke remote yang sesuai. Anda dapat mengganti remote dengan cara ini, per cabang . [Catatan 1]

Menurut Dokumentasi Resmi Git , Anda dapat mengatur a cabang push default (cukup cari remote.pushdefault pada halaman itu), namun perlu diingat bahwa ini tidak akan memengaruhi repositori / cabang yang sudah ada, jadi ini akan berfungsi tetapi hanya untuk repositori / cabang baru. Anda harus ingat bahwa --globalakan menetapkan standar repositori khusus pengguna (~ / .gitconfig),--system akan menetapkan standar repositori seluruh sistem (/ etc / gitconfig), dan tidak ada flag yang akan mengatur opsi konfigurasi untuk repositori saat ini (./.gitconfig).

Juga harus dicatat bahwa opsi konfigurasi push.default adalah untuk mengkonfigurasi perilaku ref-spec , bukan perilaku jarak jauh .

[1]: git branch --set-upstream myotherremotebiasanya akan bekerja di sini, namun git akan mengeluh bahwa ia tidak akan menetapkan cabang sebagai remote-nya sendiri jika git branch --set-upstream myremotedigunakan. Namun saya percaya ini adalah perilaku yang salah.


Alih-alih git config -l | grep myremote, Anda cukup menggunakan:git config --get branch.myremote.remote
Murmel

@Murmel pertama, ini adalah wiki komunitas jadi jangan ragu untuk memperbaiki, kedua, --getmengasumsikan perilaku tertentu, saya membuat catatan bahwa ada cara lain untuk mengatur upstreams tetapi ini menyediakan cara untuk menemukan informasi tanpa hanya mengandalkan git tooling untuk menjadi benar. Git tidak sempurna, lebih baik untuk memahami data, apa yang dilakukannya dan kemudian berharap doa-doanya bekerja dengan tepat.
smaudet

10

Mungkin bermanfaat untuk melihat di .git/configdalam repo Anda, ini akan mencantumkan semua remote dan juga remote default untuk setiap cabang

misalnya.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@gitea.xxx.be:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

Anda dapat membuat perubahan manual dalam file ini untuk menghapus remote yang tidak diinginkan, atau memperbarui remote default untuk berbagai cabang yang Anda miliki

  • Perhatian! ketika mengubah atau menghapus remote pastikan untuk memperbarui semua referensi untuk itu di file konfigurasi ini

5

Teknik lain yang baru saja saya temukan untuk menyelesaikan ini (bahkan jika saya menghapus asal terlebih dahulu, apa yang tampaknya menjadi kesalahan) adalah memanipulasi git config secara langsung:

git config remote.origin.url url-to-my-other-remote

5
Ini bukan solusi yang baik, pengguna git harus dapat menarik / mendorong dari beberapa repositori - meskipun ini akan memungkinkan Anda untuk mengubah remote asli, itu tidak berarti bahwa Anda HARUS mengubah remote asli, karena ini kemungkinan akan berarti bahwa ada sejumlah ketidakcocokan antara remote. Menggabungkan akan membantu di sini, tetapi lebih sederhana dan mempertahankan lebih banyak sejarah untuk mengatur jarak jauh pada cabang baru.
smaudet

Bukan cara yang tepat untuk melakukannya ... @ Jawaban Jordan lebih tepat
Raja Anbazhagan

1
Lihat juga: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

5

Sangat sederhana, dan mengumpulkan beberapa komentar hebat di sini bersama dengan penelitian saya sendiri tentang ini.

Pertama, periksa cabang lokal yang ingin Anda ikat ke cabang jarak jauh Anda:

git checkout mybranch

Lanjut:

git branch -u origin/mybranch

dimana:

git branch -u {remote name}/{branch name}

Anda harus mendapatkan pesan:

"Branch mybranch set up to track remote branch mybranch from origin."

3

Dalam kasus saya, saya memperbaiki dengan yang berikut: * run git config --edit * Dalam file konfigurasi git:

[branch "master"]
remote = origin # <--- change the default origin here

0

git remote set-url --push origin harus berfungsi, seperti yang Anda sebutkan, tetapi Anda harus secara eksplisit memberikan url alih-alih nama jarak jauh alternatif, misalnya

git remote set-url --push origin git@github.com:contributor/repo.git

Anda dapat mengkonfirmasi apakah ini berhasil dengan melakukan a git remote -v. Misalnya

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    git@github.com:contributor/testify.git (fetch)
fork    git@github.com:contributor/testify.git (push)
origin  git@github.com:stretchr/testify (fetch)
origin  git@github.com:contributor/testify.git (push)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.