Git: Etkin bir şubeyi çıplak bir depoda değiştirmenin doğru yolu var mı?


195

Projem için merkezi mağaza olarak kullanılan çıplak bir depom var. Tüm geliştiriciler git clone <repo>onunla paylaşmak için yaparlar . Klonu yaptıkları zaman, ana daldan bir ödeme alırlar (yapmazlarsa git clone -n) çünkü repo.git/HEADiçerdiği ref: refs/heads/masteriçin bunu Aktif Dal yapar .

Soru, Aktif Şubeyi nasıl düzgün bir şekilde değiştirebilirim ? Sadece repo.git/HEADdosyayı doğrudan hackleyebilirdim , ama bu kötü ve, hacky gibi görünüyor.

git checkout <otherbranch>Repo .gitdizininde yapmayı denedim , ancak çalışma ağacında olmadığım için başarısız oldu.

Denedim git update-ref HEAD refs/heads/otherbranchama sadece refs / heads / master'ın refs / heads / otherbranch ile aynı olması için güncellendi (tamam, bunu kukla bir depoda yaptım, üretimde değil!)

Denedim git update-ref --no-deref HEAD refs/heads/otherbranchve neredeyse işe yaradı. HEADDosyayı güncelledi , ancak işaret ettiği taahhüdün SHA1'ine ayarladı refs/heads/otherbranch.

Git sürümü ile test ediyorum 1.7.0.2.msysgit.0.

git pushTüm ve muhtelif varsayılan dalınızı değiştirmek için izin biraz güvenli (!) Gibi izin, bunu yapmak için hiçbir yolu olduğunu tahmin ediyorum , ama kesinlikle dosya .gitdoğrudan kesmek daha repo dizinde yapmak için daha iyi bir yolu var HEAD.


IMO sadece temelde burada Yanlış Şey yapmaya çalışıyorsunuz. Varsayılan dalın master'dan başka bir şey olmasını istiyorsanız, o dalın master olması gerekir. Alternatif olarak, iki farklı depo kullanın.
Nicholas Knight

12
Bu temelde burada yanlış olanı nasıl yapmaya çalışıyor? Çıplak bir depo birden fazla dalı destekler. Yerel veri havuzuma yedek olarak çıplak bir depo kullanıyorum ve bu şekilde dalları yansıtıyor. Her ikisinde de usta, ikisinde de geliştirme dalım var. Eğer çıplak depodaki geliştirme dalının günlüğünü görmek istiyorsam, dosyaları hacklemeliyim - git çıplak depo desteği konusunda burada temelde yanlış gibi görünüyor.
Cthutu

15
@NicholasKnight IMHO burada temelde yanılıyorsun. Şube adı olarak "master" ile ilgili özel bir şey yoktur, bu sadece bir varsayılan değerdir. Bakımını üstlenen yöneticilerde ana dalımız yoktur, çünkü “ana” şirket için anlamlı değildir. Bir sürüm yaptığımızda, yeni sürüm numarasıyla yeni bir bakım dalı oluşturur ve bunu etkin şube olarak atarız.
Spacemoose

Ne nereden geldiklerini takdir ederken @NicholasKnight, bu en nasıl geçin söyledi ilk SO S / A için usta! Çıplak klonumu oluşturduğumda ilk repo'yu bir özellik dalında yaptım ve o çıplak repodan sonraki klonlar, usta yerine o şubeye düşüyordu.
Warbo

1
Vay canına - bu soru sadece koşuyor ve çalışıyor - bu benim 1 numaralı sayım puanlamam! "Usta" ile ilgili olan şey, sadece bir isim olması ve kuruluşunuz, ekibiniz, projeniz, evreniz, herhangi bir şey için mantıklı gelmemesi durumunda, ortak çalışanlar repo'nuzu klonladığında hemen geçiş yapacakları Configuration Manager olarak açık olmasını istediğiniz şubeye yönlendirin. ClearCase (bletch!) İle çalışırdım, böylece seçimleriniz "ana", "ana" veya "ana" idi. Yuk.
kbro

Yanıtlar:


280

Uzak çıplak depoya erişiminiz varsa, bu makalede şunlar önerilmektedir :

git symbolic-ref HEAD refs/heads/mybranch

Hangisi deponuzdaki HEAD dosyasını içerecek şekilde güncelleyecektir:

ref: refs/heads/mybranch

belgelendiği gibi git-symbolic-ref


Uzak depoya erişiminiz yoksa önceki yanıtıma bakın .


Şöyle bir komut olduğunu unutmayın git remote set-head:

  • uzak deponun varsayılan dalını değiştirmez .
    Yalnızca yerel deponuzda depolanan bir uzak izleme dalını şu şekilde değiştirir:refs/remotes/<name>/HEAD

  • HEADkendini değiştirmez (yine, sadece refs/remotes/<name>/HEAD), dolayısıyla ihtiyaç vardır git symbolic-ref.

Yani git remote set-head değil burada cevap.
git symbolic-ref HEAD, uzak depoya doğrudan erişiminiz varsa.


3
Teşekkürler! Uzak çıplak repo'ya doğrudan erişimim var, bu yüzden git-symbolic-ref işi yapacak. Yine de diğer iş parçacığında adı geçen ortak ata hüner seviyorum - kesinlikle bir alt çekmece için. Ben bunun için yaşları googling geçirdim ama önceki cevabınızı bulamadım, ancak "git remote head master" ikinci git en yüksek ikinci hit, bul-remote (1) hemen altında bulur. Tuhaf. Sadece tam olarak ne aradığınızı bilmediğinizde bir şey bulmanın ne kadar zor olduğunu göstermeye gider.
kbro

git symbolic-ref HEAD refs/heads/mybranchbenim için iyi çalıştı! TEŞEKKÜRLER! ;)
vinzenzweber 26:12

1
Bu soruyu gerçekten takdir ediyorum, çünkü yanlışlıkla ustadan farklı bir şubeye baktım ve şimdi bunu düzeltmek zorunda kaldım.
Jonny Best

Bu benim için işe yaramıyor. Tuhaf bir şekilde, çıplak repodaki uzak KAFA artık doğru dalı gösterse de, git STILL ondan klonladığımda varsayılan olarak beni farklı bir şubeye çeviriyor!
Magnus

@Magnus, yeni bir sayfada sormak için iyi bir soru olurdu.
VonC

3

Şubeyi değiştirmek için, HEAD referansını kullanmak istediğiniz şubeye değiştirmeniz gerekir.

İlk olarak çıplak depodaki tüm referansları yaparak

$find ref

Daha sonra şubeniz için referansı bulun, biçim aşağıdaki gibi olacaktır refs/heads/<my_branch>. Bir sonraki adım mevcut referansı kontrol etmektir, sadece şunu yazın:

$git symbolic-ref HEAD

böylece geçerli dalın hangisi olduğunu biliyorsunuz ve sonra gerektiği gibi güncelleyiniz.

$git sumbolic-ref HEAD ref/heads/<my_branch>

Teşekkürler. Zevk almak.


2

Etkin Şube nasıl düzgün şekilde değiştirilir?

  • status: git repo .git dizinindeki checkout ölümcül döndürüyor: Bu işlem bir çalışma ağacında çalıştırılmalıdır

  • ipuçları: sadece --work-tree argümanını ekleyin

ayrıntılı örnek: varsayımlar: uzak sunucuda çıplak git:

~ / bare_git_repository.git müstakil çalışma ağacı: / var / www / myappremote

yerel sunucuda: şube sürümü oluştur.1.7 (otherbranch)

git şube sürümü.1.7

git push başlangıç ​​sürümü.1.7

uzak sunucuda git bare repo ile:

$ cd ~ / bare_git_repository.git

$ git branch

  • ana
    sürüm.1.7

Belirtildiği gibi, aşağıdaki komut

git ödeme sürümü.1.7

dönüş

ölümcül: Bu işlem bir çalışma ağacında gerçekleştirilmelidir

Aşağıdaki komutu kullanma

git --work-tree = / var / www / myappremote ödeme sürümü.1.7

Etkin Şube'yi başarıyla değiştirin

$ git branch

usta

  • version.1.7

sonuçları aşağıdakilerle kontrol edin

ll / var / www / myappremote

umarım yardımcı olur


Bu çok basit çözüm benim için çalıştı, teşekkürler! Bir not: Komutun başarıyla yürütülmesi için elle boş bir çalışma ağacı dizini oluşturmak zorunda kaldım.
Joël Esponde

-1

Ayrıca, bir yaparak, çıplak depo erişimi yoksa git remote set-headve bitirdiniz

Bu önceki yanıtı görün


-3

Ayrıca sunucumuzda çıplak bir repo var ve başarıyla kullanarak dosyaları almak mümkün

git clone //server/repo/directory -b branch_name

manpage bunun sadece çıplak olmayan depolar için olduğunu söylemesine rağmen yeni bir yerel depoya dönüştürdü.


1
Söylediğiniz doğru olsa da, belirli bir dalı seçmek için -b'yi kullanmanız cevabımı sorumun bağlamında kırar, VARSAYILAN dalı nasıl ayarlarsınız.
kbro

-4

Başvurmadan önce ve sonra iki dizini karşılaştırdım

git symbolic-ref HEAD refs/heads/mybranch

ve sadece repo.git / HEAD dosyasının değiştirildiği görülüyor, bu yüzden sadece dosyayı "hacklemek" oldukça güvenli.


2
Git ref dosyalarını doğrudan düzenleyerek ortaya çıkabilecek ince kırılma sorunları vardır. Buna karşı tavsiye ederim. Sıhhi tesisat komutları, referansları doğrudan düzenlemekten daha kolay ve güvenlidir.
Alain O'Dea

2
Bu @ boryn'in avantajı nedir?
Alex Chamberlain

2
Git, arka planda refs geçmişi gibi birçok şeyi takip eder. Dosyayı manuel olarak değiştirirseniz kaydedilmez. Muhtemelen önemli olmayacağı doğrudur. Ancak bazı taahhütlerin izini kaybederseniz ve bulmak istiyorsanız, sadece dosyayı "hacklemezseniz" daha mutlu olursunuz.
qwerty9967

Komutu kullandım. Ama bu cevap nasıl çalıştığını anlamak için ve partucularda, ref / kafaların içsel bir şey olduğunu anlamak ve bunu değiştirmemeliydim, sadece "yolun" son kısmı. Bu yüzden oy kullandım çünkü sonuçta değerli bir bilgi olduğunu düşünüyorum.
Mike Keskinov
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.