“Git --bare init” deposunu nasıl kullanıyorsunuz?


321

Merkezi bir Git deposu oluşturmam gerekiyor ama biraz kafam karıştı ...

Ben çıplak bir depo (git sunucum, makine 2) ile oluşturduk:

$ mkdir test_repo
$ git --bare init

Şimdi dosyaları yerel veri havuzumdan (makine 1) çıplak depoya (makine 2) aktarmam gerekiyor. SSH ile makine 2'ye erişimim var. Mesele şu ki, çıplak bir depo kavramını anlamıyorum.

Kodumu çıplak depoda saklamanın doğru yolu nedir? Yerel veri havuzumdaki değişiklikleri çıplak veri havuzuna nasıl aktarabilirim?

Çıplak bir depoya sahip olmak için merkezi bir depoya sahip olmanın doğru yolu var mı?

Bu konuda biraz kafam karıştı. Lütfen bana bir ipucu ver.

Yanıtlar:


392

Öncelikle, kontrol etmek için çalıştırmadan önce oluşturduğunuz dizine geçmeniz gerekir git init --bare. Ayrıca, çıplak depolara uzantı vermek gelenekseldir .git. Böylece yapabilirsin

git init --bare test_repo.git

Git <1.8 sürümleri için

mkdir test_repo.git
cd test_repo.git
git --bare init

Daha sonraki sorularınızı cevaplamak için, çıplak depoların (tanım gereği) kendilerine bağlı bir çalışma ağacı yoktur, bu nedenle normal çıplak olmayan bir depoda (örneğin git add <file>ve sonraki bir dosyada olduğu gibi) onlara kolayca dosya ekleyemezsiniz git commit. )

Neredeyse her zaman çıplak bir depoyu git pushbaşka bir depodan (kullanarak ) iterek güncellersiniz .

Bu durumda, öncelikle insanların deponuza itmelerine izin vermeniz gerektiğini unutmayın. İçerideyken test_repo.gityap

git config receive.denyCurrentBranch ignore

Topluluk düzenleme

git init --bare --shared=group

Prasanthv tarafından yorumlandığı gibi, bunu özel bir ev projesi yerine işte yapıyorsanız istediğiniz şeydir.


7
Ayrıca, başkalarının bu repoya aktarmasını planlıyorsanız --sharedseçeneğini de ekleyebilirsiniz init.
Depoya

17
Bence bu üç satır sadece bu ile aynı etkiye sahip: git --bare init test_repo.git En azından şu anki git versiyonumla (1.8.2.2)
Fran Marzoa

1
çıplak ve çıplak olmayan
depolar

git çalışan ağaç yoksa nasıl malzeme bulur? Git nesne deposunda çalışan bir ağaç olduğunu düşündüm ve evreleme
SHA'ların

@akantoword: git taahhütlerdeki ve şubelerdeki tüm bilgileri bir yerde saklar. Taahhüt büyük olasılıkla dosyaların önceki sürümü ile yeni sürümü arasında bir farktır. Çalışma ağacı, belirli bir zamanda gerçek içeriğinin bir anlık görüntüsüdür. Her neyse, çalışan bir ağaçla taahhütler ve dallar arasında gidip gelebilirsiniz. İsterseniz farklı bir çalışma ağacına da ödeme yapabilirsiniz.
user276648

246

Bu yanıtı ekliyorum çünkü buraya geldikten sonra (aynı soru ile), cevapların hiçbiri hiçbir şeyden tamamen kullanılabilir bir uzaktan (çıplak) repoya gitmek için gerekli tüm adımları açıklamıyor.

Not: Bu örnekte, çıplak reponun konumu için yerel yollar kullanılır, ancak diğer git protokolleri (OP tarafından belirtilen SSH gibi) iyi çalışmalıdır.

Git'e daha az aşina olanlar için yol boyunca bazı notlar eklemeye çalıştım.

1. Çıplak depoyu başlatın ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

Bu bir klasör oluşturur (repo.git) ve bir git repo'yu temsil eden git dosyalarıyla doldurur. Haliyle, bu repo işe yaramaz - taahhütleri ve daha da önemlisi şubeleri yoktur . Bu repoyu klonlayabilseniz de, ondan çekemezsiniz.

Ardından, bir çalışma klasörü oluşturmamız gerekiyor. Mevcut dosyalarınız olup olmadığına bağlı olarak bunu yapmanın birkaç yolu vardır.

2a. Boş depoyu klonlayarak yeni bir çalışma klasörü oluşturun (mevcut dosya yok)

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

Bu komut yalnızca /path/to/workyoksa veya boş bir klasör olduğunda çalışır. Uyarıyı not edin - bu aşamada hala yararlı bir şeyiniz yok. Eğer cd /path/to/workkoşarsanız git status, şöyle bir şey elde edersiniz:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

ama bu bir yalan. Gerçekten şubede değilsiniz master(çünkü git branchhiçbir şey döndürmez) ve şimdiye kadar hiçbir taahhüt yoktur.

Ardından, çalışma klasöründeki bazı dosyaları kopyalayın / taşıyın / oluşturun, onları git'e ekleyin ve ilk taahhüdü oluşturun.

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

git configZaten sen budala söylemedim eğer komutlar sadece ihtiyaç vardır. Şimdi koşarsanız git branch, masterlistelenen dalı göreceğinizi unutmayın . Şimdi çalıştırın git status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

Bu da yanıltıcı - yukarı akış "gitmedi", henüz yaratılmadı ve git branch --unset-upstreamyardımcı olmayacak. Ama sorun değil, şimdi ilk taahhüdümüz var, itebiliriz ve çıplak repoda ustalaşacağız.

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

Bu noktada, bir ana dalda başka bir yerde klonlanabilen tamamen işlevsel bir çıplak reponun yanı sıra çekip itebilen yerel bir çalışma kopyası var.

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b. Mevcut dosyalardan çalışma klasörü oluşturma İçinde dosya bulunan bir klasörünüz varsa (içine klonlayamazsınız), yeni bir git repo başlatabilir, ilk taahhüdü ekleyebilir ve daha sonra onu çıplak repoya bağlayabilirsiniz.

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

Bu noktada ilk taahhüdümüz ve uzaktan izlenen bir yukarı akış şubesine dönüştürmemiz gereken yerel bir ana dalımız var.

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

Not -u(yeni) memba şube izlenen ayarlamak için git push üzerinde bayrak. Daha önce olduğu gibi, artık bir ana dalda başka bir yerde klonlanabilen tamamen işlevsel bir çıplak repo ve çekip itebilen yerel bir çalışma kopyası var.

Bütün bunlar bazıları için açık görünebilir, ancak git beni en iyi durumda karıştırır (hata ve durum mesajlarının gerçekten biraz yeniden işlenmeye ihtiyacı vardır) - umarım bu başkalarına yardımcı olacaktır.


4
İlginç. Kesinlikle cevabımdan daha detaylı. +1
VonC

13
Bu cevap sorunumu çözdü ve kabul edilen cevap olmalı, daha fazla insanın oy kullanabileceğini umuyorum.
inix

11
Böyle cevaplar için para talep etmelisiniz
Arthur Tarasov

2
Yeni bir git kullanıcısı olarak, bu cevap bana inanılmaz yardımcı oldu, bunu yazdığınız için teşekkürler!
sidewinderguy

1
Bu harika bir cevap. Ünitemize çok yardımcı olacak.
wobsoriano

33

Sorularınızı tek tek cevaplamak:

Çıplak depo, çalışma ağacı olmayan olandır . Demek ki tüm içeriği .gitdizinde ne var .

commitDepoyu yalnızca pushyerel klonunuzdan çıkararak çıplaklaştırabilirsiniz. Hiçbir çalışma ağacı yoktur, bu yüzden değiştirilmiş dosya yok, değişiklik yok.

Merkezi depoya sahip olmanın tek yolu bir baredepoya sahip olmaktır .


22

Git'ten sizin için dizin oluşturmasını da isteyebilirsiniz:

git init --bare test_repo.git

20

Genel uygulama, çıplak bir repo olarak ittiğiniz merkezi depoya sahip olmaktır.

SVN arka planınız varsa, bir SVN deposunu Git çıplak deposuyla ilişkilendirebilirsiniz. Depodaki dosyaları orijinal biçimde içermiyor. Yerel repo ek olarak "kodu" oluşturan dosyaları olacaktır.

Yerel repodan çıplak repoya bir uzaktan kumanda eklemeli ve ona "kodunu" itmelisin.

Gibi bir şey olacak:

git remote add central <url> # url will be ssh based for you
git push --all central

Kullanılması git remote add central <url>Bu da yolunu içerecektir SSH durumunda,? ör.git remote add central ssh://user@server/home/user/repo.git
Evet Barry

17

Bu yeterli olmalı:

git remote add origin <url-of-bare-repo>
git push --all origin

Daha fazla ayrıntı için bkz. " GIT: Çıplak reporumu nasıl güncelleyebilirim? ".
Notlar:

  • originçıplak repo uzaktan referansı için ' ' dışında bir ad kullanabilirsiniz .
  • bu etiketlerinizi zorlamaz, bunun için ayrı bir ihtiyacınız git push --tags originvar.

5

İttiğiniz kodun gerçekten işlendiğini doğrulamak güzel.

Açık bir şekilde --relative seçeneğini kullanarak yolu ayarlayarak, çıplak bir depodaki değişikliklerin günlüğünü alabilirsiniz.

$ cd test_repo
$ git log --relative=/

Bu, taahhüt edilen değişiklikleri normal bir git repo'su gibi gösterecektir.


5

Mark Longair ve Roboprog cevaplarına dayanarak:

git sürümü> = 1.8 ise

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

Veya:

git sürümü <1.8 ise

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

Bu config komutu: Az önce oluşturduğunuz .git dizinine nasıl başvurulur?
GreenAsJade

Sorunu anladığımdan emin değilim? Daha kesin olabilir misin? Git deponuzu başlattığınızdan, 'git config' komutuyla istediğiniz kadar yapılandırabilirsiniz.
Jack

@GreenAsJade Hala git deposunun klasörünün içinde olmanızdan dolayı, bunun için geçerlidir (git config'in varsayılanı --local seçeneği gibidir).
BlueCoder

2

--Bare bayrağı, çalışma dizini olmayan bir havuz oluşturur. Çıplak depo merkezi havuzdur ve birleştirme hatasını önlemek için kodları burada düzenleyemezsiniz (saklayamazsınız).

Örneğin, yerel deponuza (makine 1) bir dosya eklediğinizde ve onu çıplak depoya ittiğinizde, dosyayı her zaman 'boş' olduğundan çıplak depoda göremezsiniz. Ancak, depoya gerçekten bir şey itiyorsunuz ve sunucunuzdaki başka bir havuzu klonlayarak (makineyi 2) açık bir şekilde görebilirsiniz.

Hem makine 1'deki yerel depo hem de makine 2'deki 'kopya' havuzu çıplak değildir. çıplak ve çıplak olmayan depolar arasındaki ilişki

Blog bunu anlamanıza yardımcı olacaktır. https://www.atlassian.com/git/tutorials/setting-up-a-repository


0

Yerel deponuzu başlatmak için aşağıdaki komutları yürütebilirsiniz

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

Projeniz üzerinde yerel deponuzdan çalışmalı ve sunucuyu merkezi depo olarak kullanmalısınız.

Git deposunu oluşturmanın ve sürdürmenin her yönünü açıklayan bu makaleyi de takip edebilirsiniz. Yeni Başlayanlar için Git

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.