Normal bir Git deposunu çıplak olana nasıl dönüştürürüm?


602

'Normal' Git deposunu nasıl çıplak bir depoya dönüştürebilirim?

Temel fark şudur:

  • normal Git deposunda, depo .gitiçinde ilgili tüm verileri ve çalışma kopyanızı oluşturan diğer tüm dosyaları içeren bir klasörünüz vardır.

  • çıplak bir Git deposunda, çalışan bir kopya yoktur ve klasör (diyelim ki repo.git) gerçek depo verilerini içerir


16
Muhtemelen bu daha kısa bir yöntemdir:mv repo/.git repo.git; rm -rf repo
jameshfisher

Evet doğru. Soruyu yazdığımda, bu sadece tarihimin pasajıydı, diğer dakikayı yürüttüm.
Boldewyn

54
@eegg Kullanım &&yerine ;durumda mvbaşarısız!

Yanıtlar:


609

Kısacası: içindekileri, içeriği repoile değiştirin repo/.git, sonra havuza şimdi çıplak bir depo olduğunu söyleyin.

Bunu yapmak için aşağıdaki komutları yürütün:

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

Bunun git clone --bareyeni bir konuma yapmaktan farklı olduğunu unutmayın (aşağıya bakın).


9
İpucu için teşekkürler core.bare. Şimdi, bu seçeneği kullandıktan sonra onaylayabilirim: kernel.org/pub/software/scm/git-core/docs/git-config.html
Boldewyn

14
Teşekkür ederim! Bu benim için temizleyici görünüyor: mv Repo / .git repo.git && rm-rf Repo && cd repo.git && git config --bool core.bare gerçek
JasonWoof

56
Bu, aşağıdaki cevaba göre çok daha karmaşık ve kırılgandır ( git clone --bare /path/to/repo).
djd

7
Bu rmkomutun ihtiyacı olabilir* \.[!.]**Nokta-dosya ve nokta-dizinleri kaldırmak yerine .
minopret

6
@Ciantic: Yine, yukarıdaki yorumumda daha önce açıkladığım gibi, cevabım 3 yıl önce verildi, ancak 5 ay önce biri soruyu tamamen farklı bir şeyde düzenledi . Bu sayfadaki cevapların hiçbiri artık bir anlam ifade etmeyecek. Bu komut dizisi doğrudan sorudan kopyalandı, sadece son iki satırı ekledim.
Jörg W Mittag

244

Metodunuz işe yarayacak gibi görünüyor; çıplak bir deponun dosya yapısı sadece .git dizini içerisindedir. Ancak dosyalardan herhangi birinin gerçekten değiştirilip değiştirilmediğini bilmiyorum, bu yüzden başarısız olursa,

git clone --bare /path/to/repo

Bir ad çakışmasını önlemek için muhtemelen farklı bir dizinde yapmanız gerekir ve daha sonra istediğiniz yere geri taşıyabilirsiniz. Yapılandırma dosyasını, kaynak deponuzun olduğu yeri gösterecek şekilde değiştirmeniz gerekebilir.


50
Yanlış, bu yöntem eşdeğer değil. Bir klon yapmak, git-p4 kullanmanız gibi düzgün çalışması için kritik olabilecek yapılandırma seçeneklerini korumaz. Ek olarak, bir klon uzaktan kumandaları yok eder, yine git-p4 gibi bir şeyle klonladığınızda p4 / master dalını kaybedersiniz, bu nedenle yukarıdaki yaklaşım tercih edilir.
nosatalian

26
Ancak yapılandırma dosyasının ilgili bölümlerini kopyalayarak yapılandırma seçeneklerini kolayca aktarabilirsiniz. Bu yöntemi yine de dosyaları manuel olarak kopyalayıp yeniden adlandırmaktan daha temiz olarak görüyorum.
Philipp

6
Git-svn --bare desteğinden yoksun olduğundan, bu bir yıkım geçişinden sonra mükemmeldir.
Keyo

11
İsim anlaşmazlığını önlemek için ---git clone --bare /path/to/repo.git /path/to/newbarerepo.git
raksja

Bu git update-server-info, yaratımdan sonra çıplak repoda koştuğunuz sürece çalışır .
ACK_stoverflow

116

Aşağıdaki linkin faydalı olacağını düşünüyorum

GitFaq: Mevcut çıplak olmayan depoyu nasıl çıplak yapabilirim?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo

2
Evet, aradığım şey bu, teşekkürler! Bununla birlikte, ikinci önerileri ( git clone) yukarıda nosatalianın bahsettiği dezavantajlara sahiptir.
Boldewyn

1
Önerdiğiniz belgeler, "Daha güvenli bir yöntem Git'in böyle bir şey yaparak tüm dahili ayarları işlemesine izin vermektir ... git clone --bare -l <path_to_repos> <new_dir>"
dafunker

74

Dosya sistemindeki bitleri özel olarak istemediğiniz veya istemediğiniz sürece, çıplak olmayan bir deponun çıplak bir sürümünü oluşturmak gerçekten çok basittir (burada diğer birkaç yazıda belirtilmiştir). Git'in temel işlevinin bir parçası:

git clone --bare existing_repo_path bare_repo_path


6
Uzak ve en iyi cevabın> 4 aydan sonra 0 oy alması şaşırtıcı. Çok iyi olmayan ama tehlikeli 'kabul edilen cevap' 200!
Stabledog

36
Hiç şaşırtıcı değil - bu cevap orijinal sorunun sorduğu şeyi yapmaz. Bir repoyu dönüştürmez, bir işlemi kopyalar, işlemdeki bilgileri kaybeder (örneğin, uzak dallar).
GreenAsJade

15

Lütfen ayrıca kullanmayı düşünün

git clone --mirror path_to_source_repository

Gönderen belgeler :

Kaynak havuzun bir aynasını ayarlayın. Bu - çıplak anlamına gelir. --Bare ile karşılaştırıldığında, --mirror yalnızca kaynağın yerel dallarını hedefin yerel dallarına eşlemekle kalmaz, aynı zamanda tüm referansları (uzaktan izleme dalları, notlar vb. Dahil) eşler ve tüm bu referanslar olacak şekilde bir refspec yapılandırması oluşturur hedef havuzdaki bir git uzaktan güncellemesi ile üzerine yazılır.


OP'nin istediklerini yapmanın en özlü, eksiksiz ve güvenli yolu (sadece vs. clone) gibi görünüyor. Bir şey mi kaçırıyorum? --mirrorNispeten yeni bir ekleme miydi ?
Craig Silver

@CraigSilver: Hayır, dokümantasyon geçmişinde gördüğüm gibi böyle bir formda --mirror1.7 sürümünden edinilebilir, bu yüzden zaten çok uzun. Buradan
Jacek Krawczyk

7

Ben sadece bir ağ yolunda bir depoya itmek istedim ama git depoya çıplak olarak işaretlenmedikçe gitmeme izin vermedi. Tek ihtiyacım yapılandırma değiştirmek oldu:

git config --bool core.bare true

Temiz tutmak istemiyorsanız dosyalar ile uğraşmanıza gerek yok.


3
Bu uzak deponun çalışma ağacı üzerinde de çalışmak istediğinizde tehlikelidir. Muhtemelen, uzak çalışma ağacınız ve dizininiz havuzla senkronize olmadığı için er ya da geç bir değişikliği geri almanızdır. Ne yaptığınızı tam olarak bilmiyorsanız , bu çözümü önermiyorum .
Boldewyn

Doğru, uzak çıplak repo ağacında çalışmamalısınız.
Slion

6

cevapları okudum ve bunu yaptım:

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like

bu repos/.gitçıplak olarak içeriğini bırakacaktırrepos.git


4

İşte en güvenli ve basit olduğunu düşünüyorum. Burada yukarıda belirtilmeyen hiçbir şey yok. Sadece adım adım güvenli bir prosedür gösteren bir cevap görmek istiyorum. Bir klasörü, çıplak hale getirmek istediğiniz depodan (repo) başlatırsınız. Yukarıda, çıplak depo klasörlerinin .git uzantısına sahip olduğu ima edilen sözleşmeyi kabul ettim.

(1) Backup, just in case.
    (a) > mkdir backup
    (b) > cd backup
    (c) > git clone ../repo
(2) Make it bare, then move it
    (a) > cd ../repo
    (b) > git config --bool core.bare true
    (c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
    (a) > cd ..
    (b) > mkdir test
    (c) > cd test
    (d) > git clone ../repo.git
(4) Clean up
    (a) > rm -Rf repo
    (b) (optional) > rm -Rf backup/repo
    (c) (optional) > rm -Rf test/repo

1
git klon kullanarak yedeklemenizi yaptığınızdan bu çok daha güvenli değildir. Klonlama ile yedekleme, bazı durumlarda depo için kritik olabilecek bazı yapılandırmaları kaybetmenize neden olur.
Lie Ryan

Kayıt edilmiş. Şimdiye kadar ilgilendiğim tek yapılandırmalar tüm yerel depolarım için küreseldir.
sdesciencelover

4

Basitçe okuyun

Pro Git Book: 4.2 Sunucuda Git - Bir Sunucuda Git'i Alma

aşağıya inen

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

Ardından my_project.git dosyasını sunucuya koyun

Hangisi daha çok 42 numaralı cevaba işaret etmeye çalıştı. Kesinlikle tekerleği yeniden icat edebilir ;-)


Bu cevabın ne eklediğini, etrafındaki diğer cevapların herhangi birinde keyfi olarak tartışılmadığını göremiyorum (indirilmiş olanlar dahil). Lütfen açıklığa kavuşturabilir misiniz? (Bu arada: Pro Git Book “Bu kabaca… gibi bir şeye eşdeğerdir” der ve bu kesin kaba denklik burada zaten tartışılmıştır.)
Boldewyn

3

UNIX tabanlı bir sistemde .bashrc veya .profile'ınıza ekleyebileceğiniz küçük bir BASH işlevi. Eklendikten ve kabuk yeniden başlatıldığında veya dosya, source ~/.profileveya çağrısıyla yeniden yüklenir source ~/.bashrc.

function gitToBare() {
  if [ -d ".git" ]; then
    DIR="`pwd`"
    mv .git ..
    rm -fr *
    mv ../.git .
    mv .git/* .
    rmdir .git

    git config --bool core.bare true
    cd ..
    mv "${DIR}" "${DIR}.git"

    printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
    printf "bare and renamed to\n  ${DIR}.git\n"
    cd "${DIR}.git"
  else
    printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
  fi
}

Bir kez .git dizini içeren bir dizin içinde çağrıldığında, havuzu dönüştürmek için uygun değişiklikleri yapacaktır. Çağrıldığında .git dizini yoksa, ARIZA iletisi görünür ve dosya sistemi değişikliği olmaz.


1

Dosyaları kaldırmak ve .git dizinini hareket ettirmek hakkında muck söyleyen yöntemler temiz değil ve basit olması gereken bir şey yapmak için "git" yöntemini kullanarak değil. Bu, normal bir repoyu çıplak bir repoya dönüştürmek için bulduğum en temiz yöntem.

Repo.git adlı çıplak bir repoya ilk klon / yol / / / normal / repo.git

git clone --bare /path/to/normal/repo

Daha sonra / path / to / normal / repo'yu işaret eden kaynağı kaldırın

cd repo.git
git remote rm origin

Son olarak orijinal deponuzu kaldırabilirsiniz. Bu noktada repo.git'i yeniden adlandırabilirsiniz, ancak git deposunu belirtmek için standart kural bir şeydir. Git, bu yüzden kişisel olarak bu şekilde bırakırım.

Tüm bunları yaptıktan sonra, yeni çıplak repo'nuzu klonlayabilirsiniz (aslında normal bir repo yaratır ve aynı zamanda onu çıplaktan normale nasıl dönüştürürsünüz)

Tabii ki başka akışlarınız varsa, bunları not etmek ve çıplak repo'nuzu dahil etmek için güncellemek isteyeceksiniz. Fakat yine de, hepsi git komutuyla yapılabilir. Adam sayfalarının senin arkadaşın olduğunu hatırla.


1
Diğer cevapları okumak için uğraştınız mı? Özellikle @ jonescb ve @ nosatalian'ın yorumu? "Git" yöntemi şöyledir: "Mümkün olduğunca düz metin dosyalarıyla yapın". Bir .gitklasörün içini araştırmaya başlamalısınız . Parçaların nasıl bir araya geldiğini öğrenmek son derece eğiticidir.
Boldewyn

1

Birkaç yerel checkedout şubesi / refs / heads / * ve birkaç uzak şube şubesi uzaktan kumanda / orijin / * ile bir deponuz varsa ve bunu / refs / heads / *

geçmişi kaydetmek için aşağıdakileri yapabilirsiniz.

  1. çıplak bir depo oluşturmak
  2. Yerel checkedout şubeleri ve uzak şubeleri olan yerel depoya cd
  3. git push / path / to / bare / repo + refs / uzaktan kumandalar / origin / : refs / heads /

0

Tüm komutlarımın bir listesini içeren bir metin dosyasını okumak ve bunları GIT'e dönüştürmek için aşağıdaki komut dosyasını kullandım ve daha sonra çıplak bir git deposuna dönüştürmek için git clone --bare kullanın

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name 
 sudo git clone --bare /programs/git/$repo_name $repo_name.git
 sudo chown -R www-data:www-data $repo_name.git
 sudo rm -rf $repo_name
done <"$file"

list.txt formatına sahiptir

repo1_name
repo2_name

ve users.txt formatına sahiptir

(no author) = Prince Rogers <prince.rogers.nelson@payesley.park.org>

www-data Apache web sunucusu kullanıcısıdır, HTTP üzerinden değişiklikleri göndermek için izin gereklidir


0

İşte tanımıdır çıplak depo dan gitglossary :

Çıplak depo, normalde, revizyon denetimi altındaki dosyaların yerel olarak teslim alınmış bir kopyasına sahip olmayan .git sonekine sahip uygun şekilde adlandırılmış bir dizindir. Yani, normalde gizli .git alt dizininde bulunan tüm Git yönetim ve kontrol dosyaları bunun yerine doğrudan repository.git dizininde bulunur ve başka hiçbir dosya bulunmaz ve teslim alınmaz. Genellikle halka açık depoların yayıncıları çıplak depoları kullanılabilir hale getirir.

Buraya bir "yerel depo" ile oynuyordum ve uzak bir depo gibi istediğim her şeyi yapabilmek istediğim için buraya geldim. Sadece etrafta oynuyordum, git'i öğrenmeye çalışıyordum. Bu yanıtı okumak isteyen herkes için durumun bu olduğunu varsayacağım.

Ben ancak sadece dosyaya gidiyor (buldum bazı git kaynak kodu ile karıştırmak sonra) gibi görünüyor, bir uzman görüşüne veya bazı özel karşı-örnekler için isterdim .git/configve ayar çekirdek niteliği çıplak için gerçek , git sen yapalım ne olursa olsun depoya uzaktan yapmak istiyorsunuz. Yani şu satırlar mevcut olmalıdır .git/config:

[core]
    ...
    bare = true
...

(Bu, kabaca komutun git config --bool core.bare trueyapacağı şeydir , muhtemelen daha karmaşık durumlarla başa çıkmanız önerilir)

Bu iddia için gerekçem, git kaynak kodunda, bir reponun çıplak olup olmadığını test etmenin iki farklı yolu olduğu yönünde. Birincisi, küresel bir değişkeni kontrol etmektir is_bare_repository_cfg. Bu, yürütmenin bazı kurulum aşamalarında ayarlanır ve .git/configdosyada bulunan değeri yansıtır . Diğeri bir işlevdir is_bare_repository(). İşte bu işlevin tanımı:

int is_bare_repository(void)
{
    /* if core.bare is not 'false', let's see if there is a work tree */
    return is_bare_repository_cfg && !get_git_work_tree();
} 

Ben mutlak güvenle bu demenin vakti ne de uzmanlık değil ettik, ama eğer varsa kadarıyla söyler misiniz bareüzere özellik seti trueiçinde .git/config, bu her zaman dönmelidir 1. Fonksiyonun geri kalanı muhtemelen aşağıdaki durum içindir:

  1. core.bare undefined (yani ne doğru ne de yanlış)
  2. Hiçbir çalışma ağacı yoktur (yani .git alt dizini ana dizindir)

Daha sonra yapabileceğim zaman bunu deneyeceğim, ancak bu, core.bare = true ayarının, config.bare dosyasını yapılandırma dosyasından kaldırmaya ve dizinleri düzgün bir şekilde ayarlamaya eşdeğer olduğunu gösteriyor gibi görünecektir .

Her halükarda, core.bare = true ayarının yapılması kesinlikle ona izin verir, ancak proje dosyalarının varlığının başka işlemlerin ters gitmesine neden olup olmayacağından emin değilim. İlginç ve veri havuzuna doğru ilerlemek git statusve yerel olarak ne olduğunu görmek için öğretici olduğunu düşünüyorum (yani çalıştırın ve sonuçları anlamlandırın).


-1

İlk olarak, backupmevcut deponuz:

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

İkinci olarak, aşağıdakileri çalıştırın:

git clone --bare -l non_bare_repo new_bare_repo

Ara klon ne için?
Stabledog

-4

Yukarıdaki işlemlerin tümünü yapmak için Oneliner:

for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true

(bir şey patlarsa ve yedeklemeleriniz yoksa beni suçlamayın: P)


-9

Vay canına, bu konuda kaç kişinin davrandığı şaşırtıcı, özellikle de bu kişinin neden yaptığını sormak için tek bir kişinin durmadığı görülüyor.

Çıplak ve çıplak olmayan git deposu arasındaki SADECE fark, çıplak olmayan versiyonun çalışan bir kopyası olmasıdır. Çıplak bir repoya ihtiyaç duymanızın temel nedeni, üçüncü bir taraf için kullanılabilir hale getirmek istiyorsanız, aslında doğrudan üzerinde çalışamazsınız, bu nedenle bir noktada hangi noktada klonlamanız gerektiğine normal bir çalışma kopya sürümüne geri dönün.

Söyleniyor, çıplak bir repo dönüştürmek için yapmanız gereken tek şey hiçbir taahhüt bekleyen emin olmak ve sadece:

rm -R * && mv .git/* . && rm -R .git

İşte böyle, çıplak repo.


11
Bu onu yeterince çıplak yapmaz. İçine itmeyi deneyin. Siz de yapmalısınız git config core.bare true.
Antony Hatchkins

Ben downvote yoktu, ama sadece işaret etmek istediğini açıklayan bu cevabın 1 parçası neden olmayan çıplak biridir vs bir çıplak repo isteyeyim Tamam yeterince teknik detay içermiyor olsa ve may biraz yanlış olmak. Bununla birlikte , cevabınızın 2. kısmı için, bu komutlar deponuzu çıplak olarak ayarlarken, Anthony haklıdır , yine git config core.bare truede bu cevaptaki gibi ayarlamanız gerekir .
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.