Yeni (ve boş!) Bir "kök" dal nasıl oluşturulur?


136

Bu git deposunda yeni bir "kök" dal tanımlamak istiyorum. "Kök" dal ile depodaki tüm diğer dallardan tamamen bağımsız bir dalı kastediyorum 1 .

Ne yazık ki, Adeponun commit ağacının en temelindeki commit (diyelim) bile çok fazla dosya içeriyor (bu zaten oldukça olgun bir projede başlatılmış bir havuzdu).

Bu A, yeni dal <start-point>olarak vermiş olsam bile , bu yeni dalın "temiz sayfadan" başlamayacağı, daha ziyade taahhüt edilen tüm dosyaları içereceği anlamına gelir A.

Bu depoda <start-point>olabildiğince yakın bir şekilde tamamen çıplak bir dal oluşturabilmemin bir yolu var mı A?


1 BTW, bu yeni bir depo oluşturmaya eşdeğer değildir . Ayrı depolar, birçok nedenden dolayı daha az uygun olacaktır.


DÜZENLEME : Tamam, vcsjones'un cevabına göre yaptığım şey buydu :

# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)

# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .

# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)

# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch

# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.

rm .git/info/grafts

Bu prosedür biraz karmaşık olsa da, sonuç, herhangi bir yeni "temiz sayfa dalı" için işlev görebilecek boş bir temel işlemdir <start-point>; o zaman tek yapmam gereken

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

Gelecekte her zaman bunun gibi yeni depolar oluşturacağım:

git init
git commit --allow-empty -m 'base commit (empty)'

... böylece ilk yürütme boş ve yeni bir bağımsız şube başlatmak için her zaman kullanılabilir. (Biliyorum, bu çok nadiren ihtiyaç duyulan bir tesis olurdu, ancak onu hazır hale getirmek oldukça zahmetsizdir.)



1
@Anonymoose: Sadece kayıt için (tartışma yerine): Fikrinize katılmıyorum.
kjo

1
git rebase --onto
Temel alınan

Yanıtlar:


224

--orphanŞubeyi oluştururken kullanın :

git checkout --orphan YourBranchName

Bu, üzerinde sıfır kaydetme ile yeni bir şube oluşturacaktır, ancak tüm dosyalarınız aşamalı olacaktır. Bu noktada onları kaldırabilirsin.
("onları kaldır": A git reset --harddizini boşaltır ve sizi boş bir çalışma ağacıyla bırakır)

--Orphan hakkında daha fazla bilgi için ödeme için man sayfasına bir göz atın .


Bu aslında boş bir sayfa oluşturuyor mu? Sıfırdan mı? Yoksa önceki tüm değişikliklerinizi saklıyor, ancak git geçmişinde değil mi?
Con Antonakos

4
@ConAntonakos Bu ebeveyn olmadan yeni bir şube oluşturur. Diğer şubeler etkilenmez, tüm değişiklikleri saklanır.
2016

11

Kabul edilen cevaba eklemek için - en iyi uygulama temiz duruma dönmek için yaratmaktır bir başlangıç boş taahhüt kuşaklar için şube kurulurken kolayca rebase böylece. Artı, temiz bir durum istediğiniz için, muhtemelen yapmamanız gereken dosyaları işlemişsinizdir, bu yüzden onları dizinden kaldırmanız gerekir. Bunları göz önünde bulundurarak şunları yapmalısınız:

$ git checkout --orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit

1
Bunun 2012 itibariyle gerekli olmadığına inanıyorum çünkü kök üzerinde yeniden baz alabilirsiniz .
Timmmm


1

Bu depoda tamamen çıplak bir dal oluşturabilmemin bir yolu var mı?

Kullanılacak asıl komut (Git 2.28+ ile) şudur:

git switch --discard-changes --orphan newBranch
# or
git switch -f --orphan newBranch

git switchGit 2.23'ten (Ağustos 2019) edinilebilir ve eski kafa karıştırıcı git checkoutkomutun yerini alır .

Ancak Git 2.28'i (Q3 2020) tavsiye ederim çünkü git switch --discard-changes --orphano sürümde optimize edildi.

Bkz. Commit 8d3e33d , commit 8186128 (21 Mayıs 2020) by brian m. carlson ( bk2204) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde ded44af tamamlama 2020 Haziran 9,)

builtin/checkout: meta veri başlatmayı basitleştirme

İmza: Brian m. carlson
İnceleyen: Derrick Stolee

İçeri çağırdığımızda init_checkout_metadata, reset_tree,söz konusu commit'in nesne kimliğini filtrelere geçirilebilmesi için veya commit yoksa, ağacı geçirmek istiyoruz.

Ödeme kodunun başka bir yerinde meydana gelebilecek bu ikinci durumu tahmin ettik, ancak burada gerçekleşemez.

Bir commit nesnesine sahip olmadığımız tek durum, git switchile çağırmaktır --orphan.

Dahası, bu kod yoluna yalnızca commit nesnesi olmadan --forceveya veya ile ek olarak --discard-changesulaşabiliriz.

Böyle bir durumda, kullanıma alma meta verilerini bir commit veya ağaç ile başlatmanın bir anlamı yoktur çünkü

  • (a) kesinleştirme yoktur, yalnızca boş ağaç ve
  • (b) hiçbir dosya içermeyen bir dalı teslim alırken hiçbir dosya lekelenmeyeceğinden verileri asla kullanmayacağız.

Bu durumda tümü sıfır nesne kimliğini iletin, çünkü geçerli bir gösterici olan bir değere ihtiyacımız var.

Ölçek:

git switch master
echo foo >foo.txt
git switch --discard-changes --orphan new-orphan2
git ls-files >tracked-files
# test_must_be_empty tracked-files
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.