Bagaimana cara mendaftar semua cabang jarak jauh di Git 1.7+?


634

Saya sudah mencoba git branch -r, tetapi itu hanya mencantumkan cabang jarak jauh yang telah saya lacak secara lokal. Bagaimana cara menemukan daftar yang belum saya miliki? (Tidak masalah bagi saya apakah perintah tersebut mencantumkan semua cabang jarak jauh atau hanya cabang yang tidak dilacak.)


11
Anda berarti Anda telah memodifikasi refspec default, sehingga git fetchdan git remote updatetidak mengambil semua cabang remote? Karena kalau tidak, Anda bisa mengambil kemudian menggunakan git branch -r...
Cascabel

2
Aku harus punya. git branch -rhanya menunjukkan kepada saya cabang-cabang terpencil yang telah saya lacak secara lokal. Ini bekerja lebih baik sekarang.
James A. Rosen

Jawaban:


804

Untuk sebagian besar [1] pengunjung di sini, jawaban yang benar dan paling sederhana untuk pertanyaan "Bagaimana cara mendaftar semua cabang terpencil di Git 1.7+?" adalah:

git branch -r

Untuk minoritas kecil [1] git branch -r tidak berfungsi. Jika git branch -rtidak berhasil coba:

git ls-remote --heads <remote-name>

Jika git branch -rtidak berfungsi, maka mungkin seperti yang dikatakan Cascabel "Anda telah memodifikasi refspec default, sehingga git fetchdan git remote updatejangan mengambil semua remotecabang" .


[1] Pada saat penulisan catatan kaki 2018-Februari ini, saya melihat komentar dan melihat bahwa git branch -rkarya - karya untuk sebagian besar (sekitar 90% atau 125 dari 140 ).

Jika git branch -rtidak berfungsi, centang git config --get remote.origin.fetchberisi wildcard ( *) sesuai jawaban ini


15
Anda juga dapat melakukannya git ls-remote [url]sehingga Anda tidak perlu mengkloningnya terlebih dahulu :)
Zsub

142
Jawaban ini benar tetapi menyesatkan, hal pertama yang harus dilihat pengguna dari mesin pencari adalah: git branch -rkarena itu adalah jawaban yang benar dan paling sederhana, penanya memiliki kasus khusus di mana ia memodifikasi perilaku miliknya git branch -rsehingga sebagian besar pengguna yang datang ke sini tidak akan have
Stephan

24
@Stephan: Anda yakin tentang ini? git branch -rjuga tidak bekerja untuk saya. Itu hanya daftar cabang yang sudah dilacak secara lokal. Tetapi git ls-remote --headsterdaftar semua cabang yang tersedia di repositori jarak jauh ...
rexford

2
Jika seseorang ingin mengambil dari cabang yang terdaftar melalui git ls-remote(dan tidak terdaftar di git branch -r), seseorang harus mengeksekusi git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"sebelum mengambil seperti yang dijelaskan di stackoverflow.com/a/26649770/873282 .
koppor

11
Jangan lupa lakukan git fetch --allsebelumnya untuk mendapatkan semua cabang jarak jauh saat ini.
A. Attia

173

remote show menunjukkan semua cabang di remote, termasuk yang tidak dilacak secara lokal dan bahkan yang belum diambil.

git remote show <remote-name>

Itu juga mencoba untuk menunjukkan status cabang relatif terhadap repositori lokal Anda:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

Persis. Tidak diambil, tidak dilacak secara lokal.
Thufir

3
branch_that_is_not_tracked tracked?
Piotr Dobrogost

3
@PiotrDobrogost Ya! branch_that_is_not_trackedadalah cabang yang tidak dilacak oleh cabang git lokal mana pun. Namun, telah diambil ke repositori lokal (jadi ada cabang jarak jauh). Untuk beberapa alasan aneh git remote showmenyebut keadaan ini tracked, meskipun tidak ada cabang lokal yang melacak remote. Dalam hal ini, kebalikannya trackedadalah new, yang berarti "tidak diambil".
Klas Mellbourn

ini tidak berfungsi secara pemrograman, terlalu sulit untuk diurai
Alexander Mills

Ini menangkap kasus khusus yang saya miliki di mana saya menarik cabang terpencil secara lokal yang kemudian dipindahkan pada remote. Kemudian git branch -rmenyarankan bahwa masih ada cabang yang jauh, tetapi git remote show originmenunjukkan itu refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Jauh lebih bermanfaat!
icc97

54
git branch -a | grep remotes/*

10
Ini pada dasarnya setara dengan git branch -r, yang menurut OP tidak cukup baik.
Cascabel

9
sebenarnya keduanya git branch -adan git branch -rdaftar semua cabang jauh untuk saya, saya tidak yakin apakah apa yang dikatakan OP itu benar. Saya baru saja menyiapkan repositori tes dan memverifikasi ini (hanya memiliki asal pelacakan master / master tetapi masih melihat semua cabang jarak jauh dengan kedua bendera).
Idan K

2
tampaknya ini tidak mencantumkan semua cabang jarak jauh jika saya mengkloning dari repo yang sudah ada dan kemudian secara manual menunjuk asal pada server git. Jawaban yang diterima menangani kasus ini.
nielsbot

Solusi ini tampaknya tidak mencantumkan cabang jarak jauh yang dibuat sejak saya terakhir kali mengambil.
Anubian Noob

Yang aneh: Selama bertahun-tahun saya telah menggunakan git fetchdiikuti oleh git branch -a, yang baru saja mulai gagal untuk saya. Mungkin perilaku git diubah?
Sebastian Mach

39

Menggunakan git branch -rdaftar semua cabang jarak jauh dan git branch -adaftar semua cabang di lokal dan jarak jauh. Daftar ini sudah ketinggalan zaman. Agar daftar ini tetap terbaru, jalankan

git remote update --prune

yang akan memperbarui daftar cabang lokal Anda dengan semua yang baru dari jarak jauh dan menghapus yang tidak ada lagi. Menjalankan perintah pembaruan ini tanpa --prune akan mengambil cabang baru tetapi tidak menghapus yang tidak lagi pada remote.

Anda dapat mempercepat pembaruan ini dengan menentukan remote, jika tidak maka akan menarik pembaruan dari semua remote yang telah Anda tambahkan, seperti itu

git remote update --prune origin

Ini memperbaiki masalah saya - 'git branch -r' sekarang berfungsi untuk saya.
Francis Norton

27

Tapi

git branch -ar

harus melakukannya.


41
Melewati di kedua argumen itu berlebihan. -rmengembalikan hanya cabang jarak jauh. -amengembalikan cabang lokal dan remote. Dengan demikian, git branch -adan git branch -arkeduanya menghasilkan output yang sama.
Walter Roman

19

Anda juga dapat melakukan git fetchdiikuti oleh a git branch -r. Tanpa mengambil Anda tidak akan melihat cabang-cabang terbaru.


git fetch --alluntuk memiliki semua cabang saat ini
A. Attia

19

Git Branching - Cabang Terpencil

git ls-remote

Dokumentasi git .


git ls-remote --head untuk mendapatkan hasil yang lebih spesifik
Wolfgang Fahl

1
Ini adalah satu-satunya perintah yang juga mencantumkan cabang saya tanpa sengaja saya mendorong heads/masuk refs/heads/features/my-branch, terima kasih!
msa


9

TL; TR;

Ini adalah solusi dari masalah Anda:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

atau:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

Perintah terbaik untuk dijalankan adalah git remote show [remote]. Ini akan menampilkan semua cabang, jarak jauh dan lokal, dilacak dan tidak terlacak.

Berikut ini contoh dari proyek sumber terbuka:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

Jika kita hanya ingin mendapatkan cabang jarak jauh, kita bisa menggunakan grep. Perintah yang ingin kita gunakan adalah:

grep "\w*\s*(new|tracked)" -E

Dengan perintah ini:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

Anda juga dapat membuat alias untuk ini:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Maka Anda bisa lari git branches.




4

Jalankan saja sebuah git fetchperintah. Ini akan menarik semua cabang jarak jauh ke repositori lokal Anda, dan kemudian lakukan git branch -auntuk mendaftar semua cabang.


1

Jika ada cabang jarak jauh yang Anda tahu harus terdaftar, tetapi tidak terdaftar, Anda mungkin ingin memverifikasi bahwa asal Anda diatur dengan benar dengan ini:

git remote show origin

Jika itu semua baik, mungkin Anda harus menjalankan pembaruan:

git remote update

Dengan asumsi bahwa berjalan dengan sukses, Anda harus dapat melakukan apa yang jawaban lain katakan:

git branch -r

1

Menggunakan perintah ini,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

Ini mencantumkan semua cabang jarak jauh termasuk pesan komit dan ID komit yang dirujuk oleh cabang jarak jauh.


1

Saya akan menggunakan:

git branch -av

Perintah ini tidak hanya menampilkan daftar semua cabang, termasuk cabang jarak jauh yang dimulai dengan /remote, tetapi juga memberikan Anda *umpan balik tentang apa yang Anda perbarui dan komit terakhir.


0

Pastikan asal jauh yang Anda daftarkan benar-benar repositori yang Anda inginkan dan bukan klon yang lebih lama.


0

Saya akhirnya melakukan pipa shell untuk mendapatkan apa yang saya inginkan. Saya baru saja menggabungkan cabang dari remote asal:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

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.