Git uzak HEAD'i master dışında bir şeye işaret edecek şekilde değiştirin


124

Git uzaktan kumandanın HEAD referansını "ana" dışında bir şeye işaret edecek şekilde nasıl ayarlayabilirim?

Projemin "ana" dal kullanmama politikası var (tüm dalların anlamlı isimleri olmalıdır). Ayrıca, kurallı ana depoya kabuk erişimi olmadan (GitHub veya Unfuddle gibi) yalnızca ssh: // aracılığıyla erişilebilir.

Benim sorunum, uzak deponun hala refs / heads / master'a bir HEAD referansına sahip olması, ancak bunun farklı bir dalı işaret etmesine ihtiyacım var. Bu iki soruna neden oluyor:

  1. Depoyu klonlarken, işte bu,

    uyarı: uzak HEAD, kontrol edilemeyen, var olmayan ref anlamına gelir.

    Bu kafa karıştırıcı ve rahatsız edici.

  2. Web tabanlı kod tarayıcısı, ağaca göz atmak için temel olarak HEAD'e bağlıdır. O halde geçerli bir dalı işaret etmek için HEAD'e ihtiyacım var.


Kayıt için bir olasılık ekledim, ancak sizin durumunuz için uygun değil.
VonC

"ortak olmayan ata" numarası: ilginç. Ayrıntılı bir cevap olarak gönderebilir ve işe yaradığını görürseniz resmi cevap olarak seçebilirsiniz.
VonC

12
FWIW, soruda GitHub'dan bahsettiğinizden beri - GitHub'da HEAD referansını değiştirmek istiyorsanız, deponun "Yönetici" ekranına gidin ve "Varsayılan Dal" açılır menüsünü HEAD'in işaret etmesini istediğiniz şubeye değiştirin.
Joe


Yanıtlar:


63

Bir yıl önce GitHub'da neredeyse aynı soru vardı .

Fikir, ana şubeyi yeniden adlandırmaktı:

git branch -m master development
git branch -m published master
git push -f origin master 

Usta yapmak, insanların kullanmasını istediğiniz şeye sahip olun ve diğer tüm işleri şubelerde yapın.

(" git-symbolic-ref HEAD refs/head/published" uzak depoya yayılmaz)

Bu, " Git'te origin / master'ı nasıl silerim " e benzer .


Bu ileti dizisinde söylendiği gibi : (vurgu benim)

" git clone" yalnızca tek bir yerel şube oluşturur.
Bunu yapmak için, HEAD refuzak depoya bakar ve başvurduğu uzak dalla aynı adı taşıyan yerel bir şube oluşturur.

Yani bunu bitirmek için repo A'nız var ve onu klonlamanız gerekiyor:

  • HEADreferanslar refs/heads/masterve var olan
    -> kökenden / ana makineden başlayarak ana adlı yerel bir şube alırsınız

  • HEAD referansları var refs/heads/anotherBranchve
    -> anotherBranchden başlayarak yerel bir şube alıyorsunuzorigin/anotherBranch

  • HEAD referansları var refs/heads/masterve yok
    -> "git clone" şikayet ediyor

HEADBir depodaki referansı doğrudan değiştirmenin herhangi bir yolu olup olmadığından emin değilim .

(Sorunuzun tüm noktası bu, biliyorum;))


Belki de tek yol, "fakirler için bir yayın" olabilir , burada:

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

Ancak bu, her zaman mümkün olmayan sunucuya yazma erişimini içerir.


" Git: Çıplak bir depodaki Aktif Şubeyi değiştirmenin doğru yolu? " Dagit remote set-head açıkladığım gibi, uzak depodaki hiçbir şeyi değiştirmez.

Yalnızca yerel deponuzda yerel olarak depolanan uzaktan izleme şubesini remotes/<name>/HEAD.


Teşekkürler VonC. Bunu buraya göndermeden önce okudum. Ancak görebileceğiniz gibi, bu projede teknik ve politik nedenlerle "usta" adlı bir şube hoş karşılanmıyor.
JasonSmith

Daha sonra, bir ön işleme kancası yoluyla ana dalda herhangi bir güncellemeye izin vermeyerek bu ilkeyi uygulayabilirsiniz.
VonC

Evet, istediğimi yapmanın bir yolu olmadığı ortaya çıkarsa, o zaman tam olarak bunu yapacağım ve cevabınızı kabul edeceğim. Takip ettiğiniz için teşekkürler!
JasonSmith

Güncelleme için teşekkürler. Şu an için, "ortak-ata-yok" hilesini tek bir kesinleştirme ile bir ana dal yapmak için kullandım. (Yani: git branch -D ana; yankı başvurusu: refs / heads / master> .git / HEAD; rm *). Sonra GO_AWAY adlı bir dosyaya dokundum ve commit mesajı durumu açıklıyor. Şimdilik işe yarayacak. Kaynağı kontrol edebilir ve alıcı tarafın son bir cevap için HEAD'i belirlediği yeri bulabilirim.
JasonSmith

1
@ctn Bu sadece -f( --force) seçeneğini unuttuğum için . Cevabı buna göre düzenledim. O zaman referansın cevabı aynı seçeneği kullanıyor.
VonC

42

Güncelleme: Bu sadece deponun yerel kopyası ("istemci") için işe yarar. Lütfen aşağıdaki diğerlerinin yorumlarına bakın.

Git'in son sürümünde (Şubat 2014), doğru prosedür şu şekilde olacaktır:

git remote set-head $REMOTE_NAME $BRANCH

Örneğin, uzaktaki kafayı origindallara geçirmek developşöyle olacaktır:

git remote set-head origin develop


Bu özellik, sunucuda git'in en son sürümüne ihtiyaç duyuyor mu yoksa istemci makinede yakın zamanda git yüklenmişse yeterli mi?
Mikko Rantalainen

3
@Totor kısa ama doğru; bu cevap olumsuz oylanmalıdır. Git biraz kafa karıştırıcı olan "uzak için yerel, varsayılan dal" kavramına sahiptir. "Origin / defaultbranch" yerine "origin" yazmanıza izin verir ve tamamen istemci tarafıdır . Git-scm.com/docs/git-remote adresinde uzun hikaye # set-head
MarcH

1
@MarchH'nin ne hakkında konuştuğunu onaylamak için: run git checkout -b default; git push origin HEAD; git remote set-head origin default. Daha sonra yerel değişiklikleri cat .git/refs/remotes/origin/HEAD(olması gerekir ref: refs/remotes/origin/default) ile ve uzaktan değişikliklerin olmaması ile git remote show origin(varsayılan dalı eklemeden önceki haliyle yine de olacak) inceleyebilirsiniz.
De Novo

37

GitHub'dan bahsettiğinize göre, bunu onların sitesinde yapmak için basitçe projenize gidin, sonra ...

admin > Default Branch > (choose something)

Bitti.


1
Mükemmel! Bu, eksik kalan son kısımdı.
berkus

Kökenim / HEAD zaten ana yerine bir özellik dalını işaret ediyor. "Ana dalı" ileri geri değiştirmeyi denedim, ancak HEAD'i etkilemedi ... Herhangi bir öneriniz var mı?
Daniil Shevelev

3
Ayarlar> Şubeler> Varsayılan Dal
Chun Yang

12

Bkz: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

Bu, git deposundaki varsayılan dalı ayarlar. Bunu çıplak veya yansıtılmış depolarda çalıştırabilirsiniz.

Kullanımı:

$ git symbolic-ref HEAD refs/heads/<branch name>

6
$ git symbolic-ref HEAD refs / Heads / name-of-branch
Lamy

Bunu uzak depomda yaptım ve klonlama sorunlarımı düzeltti, herhangi bir nedenle kafanın başka bir dal adı olduğu ve bu nedenle, bestecide ana kopyayı kapatmaya çalışırken bir hatayla sonuçlanacak olan klonlama sorunlarımı düzeltti, bu senaryo için çok özel olabilir , ancak diğerleri bu durumda olabilir ve ne yapılacağını merak ediyor olabilir
Christopher Thomas

10

( Evrensel bir yanıt almayan " uzak depoda bir git sembolik ref oluştur " sorusu zaten temelde vardı .)

Ancak çeşitli git "çiftlikleri" için belirli yanıtlar vardır (burada birden çok kullanıcı kısıtlı bir arayüz aracılığıyla git depolarını yönetebilir: http ve ssh aracılığıyla): http://Github.com , http://Gitorious.org , http: / /repo.or.cz , Girar ( http://git.altlinux.org ).

Bu belirli yanıtlar, bu sayfayı okuyanlar ve bu belirli hizmetler hakkında düşünenler için yararlı olabilir.


4
Şimdi repo.or.cz'de HEAD şubesini seçmek için bir açılır menüye sahipler (örnek: repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git ) ve gitorious.org ayrıca. Harika!
imz - Ivan Zakharyaschev

7

Bir kabuktan uzak depoya erişiminiz varsa, .git'e (veya çıplak depo ise ana dizine) gidin ve HEAD dosyasını doğru başlığı gösterecek şekilde değiştirin. Örneğin, varsayılan olarak her zaman 'refs: refs / heads / master' içerir, ancak bunun yerine foo'nun HEAD olması gerekiyorsa, HEAD dosyasını düzenleyin ve içeriği 'refs: refs / Heads / foo' olarak değiştirin.


Git sunucusunda yönetici haklarına sahibim ve aynısını yaptım. Gitolite kullanıyoruz ve oluşturduğum depoya gittim. Dizin adı myrepo.git. Verilen dizinde BAŞ dosyanın içeriği değiştirildi ref: refs/heads/masterkadar ref: refs/heads/mainline. Şimdi, depoyu yerel kutumda klonlamaya çalıştığımda, hala ustalaşmayı gösteriyor. git clone ssh://gitolite@git.server/myrepoKomutayı çalıştırdım . Böyle bir davranış için herhangi bir fikriniz var mı?
Technext

Git sunucusu sürümü: git version 1.7.1& Git istemci sürümü:git version 1.9.4.msysgit.2
Technext

5

Yalnızca porselen Git komutlarını kullanarak ayrılmış bir ana dal oluşturabilirsiniz :

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

Bu bize kaba bir mesaj içeren bir ana dal verir (daha kibar olmak isteyebilirsiniz). Şimdi "gerçek" şubemizi oluşturuyoruz (buna SVN onuruna gövde diyelim ) ve onu ustadan boşuyoruz :

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

Hey! Çabuk! gitk --all , ana ve ana hat arasında bağlantı olmadan gösterecektir.

Buradaki "sihir" --amend , git commit'nin mevcut HEAD ile aynı ebeveyn ile yeni bir commit oluşturmasına ve ardından HEAD'i ona işaret etmesine neden olur . Ancak mevcut HEAD, depodaki ilk yürütme olduğu için bir üst öğeye sahip değildir, bu nedenle yeni HEAD de birini alamaz, bu da onları birbirinden koparır.

Eski HEAD kaydetme git-gc tarafından silinmiyor çünkü refs / heads / master hala onu işaret ediyor.

--Allow boş boş bir ağaç işliyorsun çünkü bayrak sadece ihtiyaç vardır. Git rm'den sonra bazı git add 'lar olsaydı, o zaman gerekli olmazdı.

Gerçekte, depodaki ilk commit'i dallara ayırarak , ağacını silerek, ayrılmış ağacınızı ekleyerek ve sonra git commit --amend yaparak istediğiniz zaman ayrılmış bir dal oluşturabilirsiniz .

Bunun uzak depodaki varsayılan dalın nasıl değiştirileceği sorusuna cevap vermediğini biliyorum, ancak ayrı bir dalın nasıl oluşturulacağına dair net bir cevap veriyor.


1
İlgisiz bir şubeyi başka bir depodan alıp ona bir isim vererek daha kolay ayrılmış bir şube oluşturabilirsiniz. Örneğin, uzaktaki şubeyle eşleşen git fetch git:user@example.com:foo remote-branch-name && git checkout -b detached-branch FETCH_HEADyeni şube ekleyecektir . Elbette, "uzak", daha önce hazırladığınız yerel dosya sistemindeki bir depo olabilir. detached-branchremote-branch-namegit:user@example.com:foo
Mikko Rantalainen

2

Öncelikle, varsayılan olarak ayarlamak istediğiniz yeni şubeyi oluşturun, örneğin:

$>git branch main

Ardından, o dalı başlangıç noktasına itin :

$>git push origin main

Artık GitHub hesabınızda oturum açtığınızda, deponuza gidip Ayarlar> Varsayılan Dal'ı seçip " ana " yı seçebilirsiniz .

Ardından, isterseniz ana dalı silebilirsiniz:

$>git push origin :master


Anlaşılması gereken temel nokta, barındırma sağlayıcınız (bu örnekte GitHub) varsayılan dalı değiştirmek için bir yöntem sağlamazsa, şansınız kalmaz. Git protokolü, uzak varsayılan dalı değiştirmek için bir özellik sağlamaz; git symbolic-refuzaktaki kabukta çalışabilmeniz veya başka bir HEADşekilde uzak havuzun kök dizininde çağrılan metin dosyasını değiştirebilmeniz gerekir .
Mikko Rantalainen

2

Soruyla ilgili olarak, şu aramayı burada bitirdim:

Yerel bir depoyu GitHub'da değiştirilmiş bir varsayılan daldan nasıl haberdar edebilirim

Tamlık için cevabı ekleyerek:

git remote set-head origin -a

0

Gitolit insanlar için, gitolit - bekle - adlı bir komutu destekler symbolic-ref. Depoya W (yazma) izniniz varsa, bu komutu uzaktan çalıştırmanıza izin verir.


-1

Basitçe GitHub hesabınıza giriş yapın ve navigasyon menüsünde en sağda Ayarlar'ı seçin , Ayarlar Sekmesinde Varsayılan Dal'ı seçin ve benim için hile yapan deponuzun ana sayfasına geri dönün.


1
GitHub arayüzünde yeni dalı varsayılan olarak göstermesine rağmen, git klonu [repo] yaparken o dalı alamıyorum. yani .git / HEAD yanlış referans içeriyor.
Joseph Sheedy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.