Yeni bir proje için yeni bir boş dal oluşturma


352

Projemizi saklamak için bir git deposu kullanıyoruz. Şubelerimiz orijinal şubeden ayrılıyor. Ama şimdi bazı belgeleri izlemek için yeni ve küçük bir proje oluşturmak istiyoruz. Bunun için dosyalarımızı depolamaya başlamak için yeni bir boş dal oluşturmak istiyoruz ve ağdaki diğer kullanıcıların bu dalı klonlamasını istiyorum.

Bunu nasıl yapabiliriz?

Bazı şeyleri denedim ama işe yaramadılar.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Şubeyi tamamlıyor gibi görünüyor, ancak bir getirme veya çekme yaptığımda, diğer şubelerden bilgi indiriyor ve sonra diğer projelerden de bazı ekstra dosyalar alıyorum. En iyi çözüm nedir?


11
Bunu neden bir şubede saklamanız gerekiyor? Dallar genellikle aynı kod tabanından bazı sapmalar içindir. Belki sadece yeni bir depo başlatmak daha iyi bir çözüm olabilir.
Benjamin Bannier

2
Peki, daha önce yaptık, IIRC ve tekrar yapmak istiyorum, bu yüzden merak ediyorum;)
fazineroso 20:12

3
"yeni bir proje için" - @honk olarak bunu yeni bir depoya koymanızı öneririm. Onları entegre etmek için iki seçenek var. submoduleOrijinal projede bunu yapın , örneğin docs/bu diğer repoyu işaret ederek. Veya kodu daha sonra birleştirmek isterseniz, uzaktan kumanda olarak ekleyin.
gertvdijk

1
Yetim yaklaşımının ek bir dezavantajı, .gitignoredosyalarınızı tutmanız ve sürekli olarak iki kök (dal) arasında geçiş yapmanız gerektiğidir. Ben de yeni repo yaklaşımı için, yeni bir klasörde, aynı uzaktan kumandalara sahip olmak ve başka bir şubeye doğru itmek için.
simo

Yanıtlar:


669

Bir dalı yetim olarak oluşturabilirsiniz:

git checkout --orphan <branchname>

Bu, ebeveynleri olmayan yeni bir şube oluşturacaktır. Ardından, çalışma dizinini aşağıdakilerle temizleyebilirsiniz:

git rm --cached -r .

ve dokümantasyon dosyalarını ekleyin, taahhüt edin ve github'a aktarın.

Çekme veya getirme, tüm uzak dallarla ilgili yerel bilgileri her zaman güncelleştirir. Yalnızca tek bir uzak dal için bilgileri almak / almak istiyorsanız, belirtmeniz gerekir.


18
Güzel cevap, ancak yeni dalın (önceki daldan) tüm dosyaların hazırlandığı şekilde başlaması can sıkıcı bir durum.
Matt Fenwick

12
Düzenlerken git checkout --orphan <branch>; İçinde <branch> listesi görmüyorum git branch.
Santosh Kumar

51
Sonra git checkout --orphanbirini kullanabilirsiniz git reset --hardkalan dosyaları silmek için.
Ilya Kozhevnikov

16
Şubeyi daha sonra git checkout --orphan <branch>görmemenizin nedeni henüz herhangi bir taahhüdü bulunmamasıdır. İlk taahhütten git branchsonra yeni şube yazdırılır.
Krøllebølle

13
git clean -fd izlenmeyen dosyaları kaldırır.
stefgosselin

71

Doğru cevap bir yetim dalı oluşturmaktır. Bunu blogumda nasıl ayrıntılı olarak açıklayacağım . (Arşivlenmiş bağlantı)

...

Başlamadan önce, GIT'in en son sürümüne yükseltin. En son sürümü kullandığınızdan emin olmak için şunu çalıştırın:

which git

Eski bir sürüm çıkarsa, PATH'inizi az önce yüklediğiniz sürümü içeren klasörle genişletmeniz gerekebilir.

Tamam, hazırız. Git kasanızın bulunduğu klasöre bir cd yaptıktan sonra bir yetim dalı oluşturun. Bu örnekte şubeye “mybranch” adını vereceğim.

git checkout --orphan mybranch

Yetim şubesindeki her şeyi sil

git rm -rf .

Bazı değişiklikler yapın

vi README.txt

Değişiklikleri ekleyin ve uygulayın

git add README.txt
git commit -m "Adding readme file"

Bu kadar. Eğer koşarsan

git log

taahhüt geçmişinin sıfırdan başladığını fark edeceksiniz. Ana dalınıza geri dönmek için şunu çalıştırın:

git checkout master

Çalışarak yetim şubesine dönebilirsiniz

git checkout mybranch

16
Yalnızca bağlantı yanıtları teşvik edilmez. Bağlantı taşınır veya kaldırılırsa, cevabınız değersiz hale gelir. Bu cevaba doğrudan gerekli parçaları eklemeyi düşünün. Önceden cevaplanmamış konulara özellikle dikkat edin.
bytebuster

3
Maalesef bağlantı artık geçerli değil.
Alexey

1
Arşivler harika bir şey.
lucid_dreamer

3
Önemsiz olan herhangi bir projede izlenmeyen dosyalar (yapılandırma, ortam, önbellek, vb.) Bulunacağı için çalışma dizinindeki her şeyi kaldırmak TEHLİKELİDİR.
Slava Fomin II

12

Bunun gibi yeni ve boş bir dal yapın:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Eğer proj-doc dosyalarınız zaten tek bir alt dizin altında çalışıyorsa, yeni dalı şu şekilde yapabilirsiniz:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

ki git branch --orphanbu sizi bir sürü şey yapmak git rmve bırakmak için daha uygun olabilir git mv.

Deneyin

git branch --set-upstream proj-doc origin/proj-doc

ve bunun çok fazla sorun getirmenize yardımcı olup olmadığını görün. Ayrıca, yalnızca tek bir dal almak istiyorsanız, komut satırında belirtmeniz en güvenli yoldur.


1
Bu cevap ilginçtir, çünkü tamamen boş bir ilk taahhütle başka bir dal / kök başlatmanıza izin verir.
Stéphane Gourichon

Boş bir dal yapmanın başka bir yolu, eğer geçiş yapmak sakıncası yoksagit checkout --orphan new-branch; git reset --hard
jthill

Ne işe yarar xargs?
Flux

@Flux, ağaç kimliğini bir taahhüt ağacı argümanı olarak alt üst yapmanın başka bir yoludur.
jthill

Bu yaklaşımı gerçekten seviyorum, çünkü bu mevcut şubenizden ayrılmadan boş bir yeni dal oluşturmanıza izin veriyor, artı bu aslında başlangıç ​​noktası olarak boş bir taahhüt var.
Brice

8

Git sürümünüzde --orphan seçeneği yoksa, bu yöntem kullanılmalıdır:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Biraz iş yaptıktan sonra:

git add -A
git commit -m <message>
git push origin <newbranch>

2
Dikkatli olun, git cleansilmek istemediğiniz dosyaları silebilirsiniz! Run git clean -ndxEğer gerçek için çalıştırmadan önce onu siler hangi dosyaların görmek için ilk -fseçenek.
Lassi

7

Diyelim ki masterdosyaları / dizinleri olan bir şubeniz var :

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Boş bir dal nasıl adım adım yapılır:

  1. git checkout —orphan new_branch_name
  2. Aşağıdaki komutu yürütmeden önce doğru dizinde olduğunuzdan emin olun:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

2. adımda, yeni dalınızdaki ve dalda tuttuğunuz dosyalar ile karışıklığı önlemek için tüm dosyaları yerel olarak kaldırıyoruz master. Sonra, adım 3'teki tüm bu dosyaların bağlantısını kaldırıyoruz. Son olarak, adım 4 ve sonrası yeni boş şubemizle çalışıyoruz.

İşiniz bittiğinde, şubeleriniz arasında kolayca geçiş yapabilirsiniz:

git checkout master 
git checkout new_branch

1

Bu cevabı baz alarak Hiery Nomus .

Bir dalı yetim olarak oluşturabilirsiniz:

git checkout --orphan <branchname>

Bu, ebeveynleri olmayan yeni bir şube oluşturacaktır. Ardından, çalışma dizinini aşağıdakilerle temizleyebilirsiniz:

git rm --cached -r .

Ve sonra sadece boş taahhütle şubeyi taahhüt edip,

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

Bu belgelere göz atın , hakkında net ayrıntılara sahiptir.

--orphan <new_branch>
Adlı yeni bir yetim dalı oluşturun ve <new_branch>buradan başlayın <start_point>ve bu şubeye geçin. Bu yeni dalda yapılan ilk taahhüdün ebeveynleri olmayacak ve diğer tüm dal ve taahhütlerden tamamen ayrılan yeni bir tarihin kökü olacak.

Dizin ve çalışma ağacı daha önce git checkout komutunu çalıştırmışsınız gibi ayarlanır. Bu, kök komutunu yapmak için git command -a komutunu kolayca çalıştırarak benzer bir dizi yolu kaydeden yeni bir geçmiş başlatmanızı sağlar.


1
Bir çözümün bağlantısı hoş karşılanır, ancak lütfen cevabınızın onsuz faydalı olduğundan emin olun: bağlantınızın çevresine bağlam ekleyin, böylece diğer kullanıcılarınız ne olduğu ve neden orada olduğu hakkında bir fikir sahibi olacak, ardından sayfanın en alakalı bölümünü alıntılayacağız ' hedef sayfanın kullanılamaması durumunda bağlantı kuruluyor. Bir bağlantıdan biraz daha fazlası olan yanıtlar silinebilir.
Yunnosch

1

bu yardımı buldum:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
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.