"Ana" dışında varsayılan dal adıyla nasıl bir Git deposu oluşturabilirim?


103

Gelen Pro Git kitabında , diyor

"Köken" özel değildir

Tıpkı "ana" dal adının Git'te özel bir anlamı olmadığı gibi "kökeni" de yoktur. Git init'i çalıştırdığınızda, yaygın olarak kullanılmasının tek nedeni olan "ana" bir başlangıç ​​dalı için varsayılan ad olsa da, git clone'u çalıştırdığınızda bir uzak için "origin" varsayılan addır. Bunun yerine git clone -o booyah çalıştırırsanız, varsayılan uzak dalınız olarak booyah / master'a sahip olursunuz.

Yani varsayılan şube adımızı ana veya ana şube veya benzeri bir şey olarak kullanabiliriz. Beni farklı bir varsayılan şube adıyla man git-initbaşlatacak herhangi bir seçenek görmedim repo.

GitHub, ayarlar sayfasında varsayılan dal adının nasıl ayarlanacağını gösterir . Ancak herhangi bir Git barındırma sitesinde nasıl ayarlanacağından bahsetmiyorum . Herhangi bir Git barındırma sitesi ile ilgili olarak değil, kesinlikle sadece Git açısından soruyorum .

Bunu yapmanın bir yolu var mı?


1
Github.com/git-for-windows/git/issues/2674 adresindeki ana / varsayılan şubenin adlandırılmasına bakmak için bazı çalışmalar başlatıldı .
Philip Oakley

Yanıtlar:


107

Daha Yeni Git, Yeni Repo

Git sürüm 2.28.0'dan beri git initkomut artık bir --initial-branch(veya -bkısaca) parametre alıyor. Bu iki komut, benim için her zaman "ana" dan (neyin ustası?) Daha anlamlı gelen "gövde" adlı bir dalı olan yeni bir Git deposu oluşturur:

git init --initial-branch=trunk
git init -b trunk

Bu init.defaultBranchayar ile yapılandırılabilir . Tüm yeni depoların varsayılan dal olarak "trunk" olmasını istiyorsam:

git config --global init.defaultBranch trunk

Eski Git, Yeni Repo

Bazı sistemlerde hala daha eski Git kurulumları vardır. Debian 10 sunucum (Buster, Ekim 2020 itibarıyla mevcut kararlı sürüm), -bseçeneği desteklemeyen Git 2.20 ile birlikte geliyor . Seçeneklerden biri, depoyu oluşturmak ve ardından şube adını değiştirmektir. Bu teknik normal (çıplak olmayan) depolar için çalışır:

git init
git checkout -b trunk

Bu, trunkyerine geçerli dal olarak yeni bir depo oluşturur master. Şube mastergerçekte mevcut değildir - dallar en az bir işleme sahip olana kadar oluşturulmaz. Şube oluşturulana kadar, dal yalnızca içinde bulunur .git/HEAD, bu da masterşubeye geçtiğinizde şubenin neden kaybolacağını açıklar trunk.

Çıplak Repolar

Çıplak depolar için koşamazsınız git checkout(çıplak olmanın anlamı budur). Bunun yerine, HEAD'i farklı bir dalı işaret edecek şekilde değiştirebilirsiniz:

git init --bare
git symbolic-ref HEAD refs/heads/trunk

Eski Repolar

Zaten taahhüt verdiyseniz, git branch -mbunun yerine koşabilirsiniz :

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

Bu gelen şube yeniden adlandırır masteriçin trunkoluşturulduktan sonra.

Mekanizma deponun boş olup olmamasına bağlı olarak farklı olduğu için bu biraz hantal görünüyor, ancak çalışıyor. Buna "yeni bir şube oluşturmak ve silmek master" olarak da yaklaşabilirsiniz .


İlk durumda koştuğunuzda git checkout -b trunk. Bu, o andan itibaren varsayılan dalın gövde olduğu anlamına mı geliyor?
Abhisek

2
"Varsayılan" biraz yanlış bir adlandırma. "Şimdiki şube" gerçekten burada olan şeydir.
Dietrich Epp

help.github.com/articles/setting-the-default-branch varsayılan şube hakkında konuşuyor, bu yüzden biraz kafam karıştı. Söylediklerinle ilgili biraz deney yaptım. git'te "Varsayılan" gibisi yok. teşekkürler
Abhisek

4
Bu bir Git konseptine değil, GitHub konseptine benziyor. Çekme isteklerinden bahsediyor ve Git'te "çekme isteği" diye bir şey yok.
Dietrich Epp

Ben sadece bunun gibi bir şey arıyordum
Wexoni

92

Dolaylı olarak, git initfarklı bir varsayılan dal kullanmak için yapılandırabilirsiniz : geçerli dal, HEADGit'e hangi ref olduğunu söyleyen bir metin dosyası olan "sadece" tarafından tanımlanır .

Kullanarak init.templateDir, git initfarklı bir tane kullanmayı isteyebilirsiniz :

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

ve ~/.config/git/template/HEADiçeri, tek bir satır (+ satır sonu) koyun: ref: refs/heads/main(varsayılan olarak dallanma main).

Bir arşiv oluştururken dizine tüm içeriği templateDirkopyalanır .git; varsayılan (burada /usr/share/git-core/templates) bazı örnek kancaları ve diğer dosyaları içerir, ancak örneğin varsayılan kancaları ayarlamak için yeni şablon dizininizi kullanabilirsiniz.

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files

Bilginize, OSX üzerinde bu talimatları izleyen herkes için şablon dosyaları için / usr / local / git / share / git-core / şablonlarına bakmanız gerekebilir
Brian Gradin

1
Not: HEADVarsayılan şablonda bir dosya da oluşturabilirsiniz , ancak bu size bir depoyu gerçekten oluştururken "yeniden başlattığınızı" söyleyecektir.
jhpratt

24

Varsayılan şube adı " master" dışında olan bir Git deposu nasıl oluşturabilirim ?

Git 2.28'i (Q3 2020) kullanırsınız: mevcut depolardaki birincil dalın adı ve yeni oluşturulan depolarda ilk şube için kullanılan varsayılan ad yapılandırılabilir hale getirilir, böylece sonunda kendimizi sabit kodlulardan ayırabiliriz ' master'.

Ve GitHub'dan Ağustos 2020'den hatırlatma :

Eğer kullanıcı, kuruluş veya işletme için yeni depolar için varsayılan dalı değişmemiştir eğer 1 Ekim 2020 tarihinde, otomatik olarak değişecektir masteriçinmain .
Bu değişikliği istediğiniz zaman devre dışı bırakabilirsiniz:

  • Kullanıcılar için, https://github.com/settings/repositories sayfasında
  • Kuruluş sahipleri için https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaultssayfada
  • Kurumsal yöneticiler için, https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegessayfada

Bu değişiklik, GitHub'ın varsayılan şubelerini yeniden adlandırmak isteyen projeleri ve bakımcıları desteklemek için yaptığı birçok değişiklikten biridir.
Yaptığımız değişiklikler hakkında daha fazla bilgi edinmek için bkz. Github / yeniden adlandırma .

Ancak Git'in kendisine geri dönelim: (2.28, Q3 2020) Bkz . Đoàn Trần Công Danh ( sgn) tarafından 508fd8e (29 Haziran 2020 ) .
Bkz 0068f21 işlemek , a471214 işlemek , 0cc1b47 işlemek , 32ba12d işlemek , 6069ecc işlemek , f0a96e8 işlemek , 4d04658 tamamlama (muhtemelen 2020 Haziran 24) ve 489947c tamamlama ile (23 Haziran 2020) Johannes Schindelin ( dscho) .
Bkz. 8747ebb (24 Haziran 2020), Don Goodman-Wilson ( DEGoodmanWilson) .
( Junio ​​C Hamano - gitster- tarafından birleştirildicommit 11cbda2 , 06 Tem 2020)

init: yeni depo için ilk şube adını belirlemeye izin ver

İmza: Johannes Schindelin

Depolarının ana şube adını değiştirmek isteyen artan sayıda proje ve şirket var (örneğin, Mislav Marohnić'in bununla ilgili arka plan için tweet'ine bakın).

Yeni havuzlar için bu dal adını değiştirmek için, şu anda bunu otomatik olarak yapmanın tek yolu Git'in tüm şablon dizinini kopyalamak, ardından istenen varsayılan dal adını .git/HEADdosyaya sabit kodlamak ve ardından init.templateDirkopyalanan şablon dosyalarını gösterecek şekilde yapılandırmaktır .

Bu süreç çok daha az külfetli hale getirmek için, en yeni bir seçenek tanıştırayım: --initial-branch=<branch-name>.

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

Ve:

init: yapılandırma aracılığıyla ilk şube adı için varsayılanı ayarlamaya izin ver


Yardımcı : Johannes Schindelin Yardımcı: Derrick Stolee
İmza: Don Goodman-Wilson

--initial-branch=<branch-name>Yeni bir depoyu, sabit kodlu olandan farklı bir ilk dal ile başlatmaya izin vermek için komut satırı seçeneğini ekledik.

Kullanıcıların ilk şube adını daha kalıcı bir şekilde geçersiz kılmalarına izin vermek için (yani adı her git initçağrı için manuel olarak belirtmek zorunda kalmadan ), init.defaultBranchyapılandırma ayarını tanıtalım.

Not: Birleştirme tamamlama mesajı hakkındaki commit 489947c , o zamandan beri Git 2.29'da geri alındı , " git'in birleştirme tamamlama mesajını nasıl özelleştirebilirim? " Konusuna bakın . Ayar olarak kalır.
init.defaultBranch


Bu, alt modülleri etkiler:

submodule: uzak dalın eksik olması durumunda uzaktaki HEAD'e geri dönün

Yardımcı: Philippe Blain
İmza: Johannes Schindelin

Ne zaman remote.<name>.branchyapılandırılmamış, git submodule updateşu anda şube adını kullanarak geri düşer master.
Bununla birlikte, çok daha iyi bir fikir, uzaktan kumandayı kullanmaktır HEAD: makul ölçüde yeni Git sürümlerini çalıştıran tüm Git sunucularında, symref HEADana dalı işaret eder.

Not: t7419 , uzak dal başka bir dala işaret etse bile , alt modülleri uzak şubeye güncellemeyi bekleyen kullanım durumlarının olabileceğini gösterir . Muhtemelen, bu yama davranışı daha sezgisel hale getiriyor, ancak bunun belirsiz kurulumlarda gerilemelere neden olma ihtimali çok az. git submodule update --remotemasterHEAD

Öyle olsa bile, bu davranışı daha uzun bir geçiş dönemi gibi bir şey olmadan düzeltmekte sorun yoktur:

  • git submodule update --remoteKomut gerçekten yaygın değildir.
  • Güncel seyahatseverlerin Git davranışı uzaktan deponun cari şube sürece bu komut düpedüz, kafa karıştırıcı çalıştırırken olduğu master (ki bu durumda önerilen davranış eski davranışı eşleşir).
  • Bir kullanıcı nedeniyle değişen davranışına bir gerileme karşılaşırsa, düzeltme aslında oldukça basittir: ayar submodule.<name>.branchiçin mastereski davranışı eski haline getireceğiz.

Git 2.29 (Q4 2020) ile testlerin contrib/son değişikliğe göre ayarlandığını unutmayın fmt-merge-msg.

Bkz. Commit b87528c (03 Ağu 2020) by Emily Shaffer ( nasamuffin) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 83b8250 tamamlama 2020 10 Eyl)

Revert "contrib:: subtreetesti değiştirmek için ayarlayın fmt-merge-msg"

İmza: Emily Shaffer

Bu, 508fd8e8baf3e18ee40b2cf0b8899188a8506d07 işlemini geri döndürür .

In 6e6029a8 ( fmt-merge-msg: Biz 'karşı birleştirmeleri davranışını geri almak birleştirme hedef tekrar çıkarılmasına izin verir) mastervarsayılan olarak, yapma,' "include into 'master'birleştirme mesajın sonunda". Bu test düzeltmesine artık gerek yoktur.

Ayrıca:

Git 2.29 (Q4 2020) ile testleri master, onlardan ' ' kelimesini çıkaracak şekilde güncelleyin .

Bkz f33f2d3 işlemek , b6211b8 taahhüt (26 Eylül 2020) ve 432f5e6 taahhüt , 5a0c32b işlemek , 659288c taahhüt tarafından (21 Eylül 2020) Johannes Schindelin ( dscho) .
(Tarafından Birleştirilmiş - Junio C Hamano gitster- içinde 58138d3 taahhüt 2020 05 Eki)

tests: masterşube adının varyasyonlarından kaçının

İmza: Johannes Schindelin

Terim master, ırksal adaletsizliğin sürekli bir hatırlatıcısı olarak hizmet eden yüklü bir geçmişe sahiptir. Git projesinin bunu sürdürme arzusu yok ve şimdiden kaçınmaya başladı.

Test paketi, varsayılanın dışındaki şubeler için bu ismin varyasyonlarını kullanır. Önceki işlemde bu konuyu ele aldığımız t3200 dışında, bu örnekler otomatik bir şekilde yeniden adlandırılabilir çünkü test komut dosyası dışında herhangi bir değişiklik gerektirmezler, öyleyse hadi bunu yapalım.

Dokunulan dalların varsayılan dal ile çok az ilgisi (varsa) olduğu için, tamamen ayrı bir adlandırma şeması kullanmayı seçiyoruz: topic_<number>(bu, topic-<number>t5515 terimiyle makineyi kullandığı ve test_oidmakine dahili olarak kabuk değişkenlerini kullandığı için olamaz , adları tire içeremez).

Bu numara şu (GNU) sed çağırma ile gerçekleştirildi:

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

Ve yine Git 2.29 ile:

Bkz. 538228e commit , commit a15ad5d (08 Ekim 2020) by Johannes Schindelin ( dscho) .
(Tarafından Birleştirilmiş - Junio C Hamano gitster- içinde 62564ba taahhüt 2020 08 Eki)

t1415: mainreferans adı olarak kullanmaktan kaçının

İmza: Johannes Schindelin

İçin sonbahar-geri değiştirecek bir yama serisi için hazırlık init.defaultBranchiçin main, en kullanmayın let mainbu test komut ref adı olarak.

Aksi takdirde, bu referansları yakalamak isteyen ( adam ) da beklenmedik bir şekilde yakalar .git for-each-ref ... | grep mainrefs/heads/main

Söz konusu referanslar çalışma ağacı-yerel olanlar olduğu için (yani her çalışma ağacının kendine ait olduğu gibi HEAD) ve test senaryosu zaten " second" adlı ikincil bir çalışma ağacı kullandığından, firstbunun yerine bu referanslar için " " adını kullanalım .

Bunun üzerindeyken, bunun yerine bir "çalışma ağacı" anlamına geldiklerinde bir "repo" dan bahseden test başlıklarını ayarlayın.


18

Git 2.28'den (27 Temmuz 2020'de yayınlandı) bu yana init.defaultBranch, sabit kodlu terimin yerine yeni bir yapılandırma seçeneği sunuluyor master.

Varsayılan olarak kalır master!

Kullanıcı, yapılandırma değişkeninin varsayılan değerini şu şekilde geçersiz kılabilir:

$ git config --global init.defaultBranch main

Daha fazla ayrıntı için git doc bölümünü okuyun init.defaultBranch'a Giriş


Evet, cevabımda aynı sayfada yazdığım şey bu. stackoverflow.com/a/62983443/6309
VonC

Ve aynı cevaba atıfta bulunarak tweetlediğim şey buydu: twitter.com/VonC_/status/1284968817010016268
VonC
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.