Bagaimana Anda menggunakan repositori “git --bare init”?

321

Saya perlu membuat repositori Git pusat tapi saya agak bingung ...

Saya telah membuat repositori kosong (di server git saya, mesin 2) dengan:

$ mkdir test_repo
$ git --bare init

Sekarang saya perlu mendorong file dari repositori lokal saya (mesin 1) ke repositori kosong (mesin 2). Saya memiliki akses ke mesin 2 oleh SSH. Masalahnya adalah saya pikir saya tidak mengerti konsep repositori telanjang ...

Apa cara yang tepat untuk menyimpan kode saya di repositori kosong? Bagaimana saya bisa mendorong perubahan dari repositori lokal saya ke repositori kosong?

Apakah cara yang tepat untuk memiliki repositori pusat untuk memiliki repositori kosong?

Saya agak bingung dengan subjek ini. Tolong beri saya petunjuk tentang ini.

André
sumber

Jawaban:

392

Pertama, hanya untuk memeriksa, Anda perlu mengubah ke direktori yang Anda buat sebelum menjalankan git init --bare. Juga, itu konvensional untuk memberikan repositori telanjang ekstensi .git. Jadi kamu bisa melakukannya

git init --bare test_repo.git

Untuk versi Git <1,8 Anda akan melakukannya

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

Untuk menjawab pertanyaan Anda nanti, repositori kosong (menurut definisi) tidak memiliki pohon kerja yang melekat padanya, sehingga Anda tidak dapat dengan mudah menambahkan file ke dalamnya seperti pada repositori non-telanjang normal (mis. Dengan git add <file>dan yang berikutnya git commit. )

Anda hampir selalu memperbarui repositori kosong dengan mendorongnya (menggunakan git push) dari repositori lain.

Perhatikan bahwa dalam hal ini Anda harus terlebih dahulu mengizinkan orang untuk mendorong ke repositori Anda. Ketika di dalam test_repo.git, lakukan

git config receive.denyCurrentBranch ignore

Suntingan komunitas

git init --bare --shared=group

Seperti dikomentari oleh prasanthv, inilah yang Anda inginkan jika Anda melakukan ini di tempat kerja, bukan untuk proyek rumah pribadi.

Mark Longair
sumber
7
Anda juga dapat menambahkan --sharedopsi untuk initjika Anda berencana meminta orang lain mendorong repo ini. Secara otomatis menambahkan izin menulis grup ke repositori - tautan
prasanthv
17
Saya pikir ketiga baris ini memiliki efek yang sama dengan yang satu ini: git --bare init test_repo.git Setidaknya dengan versi git saya saat ini (1.8.2.2)
Fran Marzoa
1
berguna jika Anda ingin mengetahui perbedaan antara repositori telanjang dan non-telanjang stackoverflow.com/questions/7861184/…
Guille Acosta
Bagaimana cara git menemukan barang jika tidak ada pohon yang berfungsi? saya pikir ada pohon yang berfungsi di git object store, dan itulah yang menjadi point SHA dan komit point untuk
akantoword
@akantoword: git menyimpan semua info tentang commit dan cabang di suatu tempat. Sebagian besar komit kemungkinan adalah perbedaan antara versi file sebelumnya dan versi baru. Pohon yang bekerja hanyalah cuplikan dari konten aslinya pada waktu tertentu. Bagaimanapun, dengan pohon yang bekerja Anda dapat bolak-balik antara komit dan cabang. Anda bahkan dapat checkout di pohon kerja yang berbeda jika Anda mau.
user276648
246

Saya menambahkan jawaban ini karena setelah tiba di sini (dengan pertanyaan yang sama), tidak ada jawaban yang benar-benar menggambarkan semua langkah yang diperlukan untuk beralih dari yang tidak ada menjadi repo (telanjang) yang sepenuhnya dapat digunakan.

Catatan: contoh ini menggunakan lintasan lokal untuk lokasi bare repo, tetapi protokol git lainnya (seperti SSH yang ditunjukkan oleh OP) akan berfungsi dengan baik.

Saya sudah mencoba menambahkan beberapa catatan untuk mereka yang kurang terbiasa dengan git.

1. Menginisialisasi repo ...

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

Ini membuat folder (repo.git) dan mengisinya dengan file git yang mewakili repo git. Seperti berdiri, repo ini tidak berguna - tidak memiliki komitmen dan yang lebih penting, tidak ada cabang . Meskipun Anda dapat mengkloning repo ini, Anda tidak dapat menariknya.

Selanjutnya, kita perlu membuat folder yang berfungsi. Ada beberapa cara untuk melakukan ini, tergantung pada apakah Anda memiliki file yang ada.

2a. Buat folder kerja baru (tidak ada file yang ada) dengan mengkloning repo kosong

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.

Perintah ini hanya akan berfungsi jika /path/to/worktidak ada atau folder kosong. Perhatikan peringatan - pada tahap ini, Anda masih belum memiliki sesuatu yang berguna. Jika Anda cd /path/to/workdan lari git status, Anda akan mendapatkan sesuatu seperti:

On branch master

Initial commit

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

tapi ini bohong. Anda tidak benar-benar di cabang master(karena git branchtidak mengembalikan apa-apa) dan sejauh ini, tidak ada komitmen.

Selanjutnya, salin / pindahkan / buat beberapa file di folder yang berfungsi, tambahkan ke git dan buat komit pertama.

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

The git configperintah hanya diperlukan jika Anda belum sudah bilang git siapa Anda. Perhatikan bahwa jika sekarang Anda menjalankan git branch, Anda sekarang akan melihat mastercabang terdaftar. Sekarang jalankan 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

Ini juga menyesatkan - hulu belum "hilang", hanya saja belum dibuat dan git branch --unset-upstreamtidak akan membantu. Tapi tidak apa-apa, sekarang kita memiliki komit pertama kita, kita bisa mendorong dan master akan dibuat di repo telanjang.

> 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

Pada titik ini, kami memiliki repo telanjang yang berfungsi penuh yang dapat dikloning di tempat lain pada cabang master dan juga copy pekerjaan lokal yang dapat menarik dan mendorong.

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

2b. Membuat folder yang berfungsi dari file yang ada Jika Anda sudah memiliki folder dengan file di dalamnya (jadi Anda tidak dapat mengkloningnya), Anda dapat menginisialisasi git repo baru, tambahkan komit pertama dan kemudian tautkan ke bare repo sesudahnya.

> 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
...

Pada titik ini kami memiliki komit pertama kami dan cabang master lokal yang kami perlukan untuk berubah menjadi cabang hulu yang dilacak dari jarak jauh.

> 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.

Perhatikan -u flag on git push untuk mengatur cabang upstream (baru) yang dilacak. Sama seperti sebelumnya, kami sekarang memiliki repo telanjang yang berfungsi penuh yang dapat dikloning di tempat lain pada cabang utama serta copy pekerjaan lokal yang dapat menarik dan mendorong.

Semua ini mungkin tampak jelas bagi sebagian orang, tetapi git membingungkan saya pada saat-saat terbaik (pesan kesalahan dan statusnya benar-benar membutuhkan pengerjaan ulang) - mudah-mudahan, ini akan membantu orang lain.

Adelphus
sumber
4
Menarik. Tentunya lebih detail dari jawaban saya. +1
VonC
13
Jawaban ini menyelesaikan masalah saya dan harus menjadi jawaban yang diterima, berharap semakin banyak orang dapat memberikan suaranya.
inix
11
Anda harus mengenakan biaya uang untuk jawaban seperti ini
Arthur Tarasov
2
Sebagai pengguna git baru, jawaban ini sangat membantu saya, terima kasih telah menulis ini!
sidewinderguy
1
Ini jawaban yang cemerlang. Akan banyak membantu unit kami.
wobsoriano
33

Menjawab pertanyaan Anda satu per satu:

Repositori kosong adalah yang tidak memiliki struktur pohon . Ini berarti seluruh isinya adalah apa yang Anda miliki dalam .gitdirektori.

Anda hanya dapat membuka commitrepositori dengan pushmemasukkannya dari klon lokal Anda. Tidak memiliki struktur pohon, jadi tidak ada file yang dimodifikasi, tidak ada perubahan.

Untuk memiliki repositori sentral, satu-satunya cara adalah dengan memiliki barerepositori.

Marcin Gil
sumber
22

Anda juga dapat meminta git untuk membuat direktori untuk Anda:

git init --bare test_repo.git
Serge S.
sumber
20

Praktik umum adalah memiliki repositori pusat yang Anda dorong sebagai repo kosong.

Jika Anda memiliki latar belakang SVN, Anda dapat menghubungkan repo SVN ke repo telanjang Git. Itu tidak memiliki file dalam repo dalam bentuk aslinya. Sedangkan repo lokal Anda akan memiliki file yang membentuk "kode" Anda sebagai tambahan.

Anda perlu menambahkan remote ke repo telanjang dari repo lokal Anda dan mendorong "kode" Anda ke sana.

Itu akan menjadi sesuatu seperti:

git remote add central <url> # url will be ssh based for you
git push --all central
manojlds
sumber
Menggunakan git remote add central <url>, dalam kasus SSH apakah ini termasuk jalan juga? mis.git remote add central ssh://user@server/home/user/repo.git
Ya Barry
17

Ini harus cukup:

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

Lihat untuk lebih jelasnya " GIT: Bagaimana cara memperbarui bare repo saya? ".
Catatan:

  • Anda dapat menggunakan nama yang berbeda dari ' origin' untuk referensi jarak jauh repo kosong.
  • ini tidak akan mendorong tag Anda, Anda perlu yang terpisah git push --tags originuntuk itu.
VONC
sumber
5

Sangat menyenangkan untuk memverifikasi bahwa kode yang Anda dorong benar-benar dilakukan.

Anda bisa mendapatkan log perubahan pada repositori kosong dengan secara eksplisit mengatur path menggunakan opsi --relative.

$ cd test_repo
$ git log --relative=/

Ini akan menunjukkan kepada Anda perubahan yang dilakukan seolah-olah ini adalah repo git biasa.

Russell
sumber
5

Berdasarkan jawaban Mark Longair & Roboprog:

jika git versi> = 1.8

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

Atau :

jika versi git <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore
Mendongkrak'
sumber
Perintah config itu: bagaimana akhirnya menerapkan ke direktori .git yang baru saja Anda buat?
GreenAsJade
Saya tidak yakin saya mengerti pertanyaan Anda? Bisakah Anda lebih tepat? Karena repositori git Anda diinisialisasi, Anda dapat mengonfigurasinya sebanyak yang Anda inginkan dengan perintah 'git config' ..
Jack '
@GreenAsJade Itu karena Anda masih di dalam folder repositori git, jadi itu berlaku untuk itu (default dari konfigurasi git seperti opsi --local).
BlueCoder
2

Bendera --bare membuat repositori yang tidak memiliki direktori yang berfungsi. Repositori kosong adalah repositori pusat dan Anda tidak dapat mengedit kode (toko) di sini untuk menghindari kesalahan penggabungan.

Misalnya, ketika Anda menambahkan file di repositori lokal Anda (mesin 1) dan mendorongnya ke repositori telanjang, Anda tidak bisa melihat file di repositori telanjang karena selalu kosong. Namun, Anda benar-benar mendorong sesuatu ke repositori dan Anda dapat melihatnya secara tidak jelas dengan mengkloning repositori lain di server Anda (mesin 2).

Repositori lokal di mesin 1 dan repositori 'salin' di mesin 2 tidak kosong. hubungan antara repositori telanjang dan non-telanjang

Blog akan membantu Anda memahaminya. https://www.atlassian.com/git/tutorials/setting-up-a-repository

Jie Zhang
sumber
0

Anda dapat menjalankan perintah berikut untuk menginisialisasi repositori lokal Anda

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

Anda harus mengerjakan proyek Anda dari repositori lokal dan menggunakan server sebagai repositori pusat.

Anda juga bisa mengikuti artikel ini yang menjelaskan masing-masing dan setiap aspek membuat dan memelihara repositori Git. Git untuk Pemula

Sameer Ranjan
sumber