Git deposuna birden fazla proje koymak için en iyi uygulama hangisidir? [kapalı]


188

Bazı nedenlerden ötürü, kullanmak için sadece bir havuzum var .
Ancak projeler ve uygulama projeleri dahil olmak üzere birden fazla projem var . javaphp scriptsAndroid

Şimdi benim sorunum, onları farklı IDE'ler kullandığım depodaki farklı alt klasörlere koymak zorundayım
, bilirsiniz, her IDE'nin kendi çalışma alanı olabilir.

Sorunu çözmek için bana en iyi uygulamayı kim söyleyebilir?



2
Yalnız değilsin. Öğrenme amaçlı kullandığım depolarımda da benzer bir durum var (örnek: github.com/hopbit/java-sandbox ).
Okumakta

Bunu yapmak istemenizin bir nedeni, test veya üretim gibi çalışma ortamı ortamlarına dağıttığınız ürün kodu olan bir projeniz olması. İkinci proje, sistemin ilk projeyi (örneğin BDD) test ettiği bir uygulamadır. Bu iki proje arasında yakın bir ilişki vardır ve şimdi tek bir havuz url'si kullanarak bütünlüğü koruyabilir / başvurabilirsiniz.
Lance Kind

Aşağıdaki gibi özet "Git, aynı veya farklı projelerin bir parçası olup olmadığı hakkında hiçbir fikri yok"
ahmednabil88

Yanıtlar:


198

Çoğu kişi size sadece birden fazla depo kullanmanızı söylese de, başka çözümler olduğunu belirtmeye değer.

Çözüm 1

Tek bir depo, yetim dalı adı verilen birden fazla bağımsız dal içerebilir . Yetim şubeleri birbirinden tamamen ayrıdır; geçmişleri paylaşmazlar.

git checkout --orphan BRANCHNAME

Bu, geçerli dalınızla ilgisi olmayan yeni bir dal oluşturur. Her proje kendi yetim kolunda olmalıdır.

Şimdi her ne sebeple olursa olsun, bir yetim ödemesinden sonra git'in biraz temizlenmesi gerekiyor.

rm .git/index
rm -r *

Silmeden önce her şeyin yerine getirildiğinden emin olun

Yetim dalı temizlendikten sonra normal olarak kullanabilirsiniz.

Çözüm 2

Yetim dalların tüm zorluklarından kaçının. İki bağımsız depo oluşturun ve bunları aynı uzaktan kumandaya itin. Her bir repo için farklı şube adları kullanmanız yeterlidir.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

Çok teşekkürler, bu benim sorunumu çözebilmelidir. Aslında, iki çözüm farklı projeler yürütmek için şubeleri kullanıyor.
Taşlı

6
Çözüm 2'yi anladığımdan emin değilim. Tüm .git dosyalarını bir master git repo'ya aktardığınızı mı söylüyorsunuz? Birden çok öksüz dal kullanmak ile birden çok dal kullanmak arasındaki farklar nelerdir?
Nate

14
@Nate Söylediği şey: iki ayrı yerel depo oluşturun, ardından her ikisini de GitHub'daki aynı uzak depoya itin .
Şapkalı Adam

1
Teşekkürler @TheGuywithTheElfHat. Şimdi ona tekrar baktığım için (9 ay sonra) bana açık görünüyor. Çözüm 2 hala yetimsiz şubeler oluşturuyor, ancak bu yöntemin nasıl daha kolay ele alındığını görebiliyorum.
Nate

21
Çözüm 2'nin daha fazla açıklamaya ihtiyacı var
eC Droid

19

Çözüm 3

Bu, birden çok proje için tek bir dizin kullanmak içindir. Bu tekniği sık sık bir projeden diğerine değişiklikleri çekmem gereken bazı ilgili projeler için kullanıyorum. Artık öksüz dallar fikrine benzer, ancak dalların yetim kalmasına gerek yoktur. Tüm projeleri aynı boş dizin durumundan başlatın.

Tüm projeleri tek bir boş dizinden başlat

Bu çözümden harikalar beklemeyin. Gördüğüm gibi, her zaman izlenmeyen dosyalarla ilgili sıkıntılar yaşayacaksınız. Git'in onlarla ne yapacağına dair bir ipucu yok ve bu nedenle bir derleyici tarafından oluşturulan ve .gitignore dosyanız tarafından göz ardı edilen ara dosyalar varsa, hızlı bir şekilde değiştirmeyi denerseniz muhtemelen bir süre asılı kalacaklar - örneğin, yazılım projeniz ve bir doktora tez projesi arasında.

Ancak plan burada. Boş depoyu taahhüt ederek git projelerini başlatmanız gerektiği gibi başlayın ve ardından tüm projelerinizi aynı boş dizin durumundan başlatın. Bu şekilde, iki dosyanın çok bağımsız olduğundan emin olabilirsiniz. Ayrıca, dallarınıza uygun bir ad verin ve tembel olarak sadece "usta" kullanmayın. Projeleriniz ayrı olmalı, bu yüzden onlara uygun isimler verin.

Git taahhüt eder (ve böylece etiketler ve şubeler) temel olarak bir dizinin ve alt dizinlerinin durumunu saklar ve Git bunların aynı ya da farklı projelerin parçaları olup olmadığı hakkında hiçbir fikre sahip değildir, bu yüzden gerçekten de aynı projede farklı projeleri depolamak için sorun yoktur. Bu durumda sorun, başka bir projeyi kullanırken izlenmeyen dosyaları bir projeden temizlemeniz veya projeleri daha sonra ayırmanızdır.

Boş bir havuz oluşturun

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Projelerinizi boştan başlatın.

Bir proje üzerinde çalışın.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Başka bir proje başlat

ne zaman istersen.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

İleri ve geri geçiş

İstediğiniz zaman projeler arasında ileri ve geri gidin. Bu örnek satranç yazılım projesine dayanmaktadır.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

İzlenmeyen dosyalar sinir bozucu

Bununla birlikte, projeler / şubeler arasında geçiş yaparken izlenmeyen dosyalar sizi rahatsız edecektir.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

Bu aşılmaz bir sorun değil

Tanıma göre, git izlenmeyen dosyalarla ne yapacağınızı gerçekten bilmiyor ve onlarla başa çıkmak size kalmış. İzlenmeyen dosyaların bir şubeden diğerine taşınmasını aşağıdaki gibi durdurabilirsiniz.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

Yeni projemize bakmadan önce dizinin boş olduğundan emin olarak başka bir projeden izlenmeyen dosya kalmadığından emin olduk.

Ayrıntılandırma

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

Boş bir depo gerçekleştirirken aynı tarihler belirtilirse, bağımsız olarak oluşturulan boş depo taahhütleri aynı SHA1 koduna sahip olabilir. Bu, iki havuzun bağımsız olarak oluşturulmasına ve daha sonra bir havuzda ortak bir kökle tek bir ağaçta birleştirilmesine izin verir.

Misal

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Sonuç

Birleştirilmiş depoların şeması

Proje başına alt dizinler kullanılsın mı?

Ayrıca, projelerinizi mümkün olduğunca alt dizinlerde tutmanız, örneğin dosyalara sahip olmak yerine,

chess.prog
philosophy_doctorate.txt 

Sahip olmak

chess/chess.prog
thesis/philosophy_doctorate.txt 

Bu durumda izlenmeyen yazılım dosyanız olacaktır chess/untracked_software_file.prog. Dizinde çalışırken thesisizsiz satranç program dosyaları tarafından rahatsız edilmemelisiniz ve diğer projelerden izlenmemiş dosyaları silmeden mutlu bir şekilde çalışabileceğiniz durumlar bulabilirsiniz.

Ayrıca, izlenmeyen dosyaları diğer projelerden kaldırmak istiyorsanız, istenmeyen bir dizini boşaltmak, her birini seçerek kaldırmaktan daha hızlı (ve hataya daha az eğilimli) olacaktır.

Şube adları '/' karakterleri içerebilir

Bu yüzden dallarınıza şöyle bir isim vermek isteyebilirsiniz:

project1/master
project1/featureABC
project2/master
project2/featureXYZ

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.