Menggunakan git sebagai repositori sentral

12

Saya telah menyiapkan git untuk saya gunakan sendiri - jadi saya dapat mengakses proyek dari 'di mana saja', dan menjaga keamanan versi jika saya bekerja pada bagian X di sini, dan bagian Y di sini, dan dapat bergabung jika perlu.

Namun, hanya satu dari mesin pengembangan saya yang memiliki IP statis. Otak saya macet dalam mode CVS, jadi saya mencoba mengatur git agar mesin itu menjadi server 'sentral', yang digunakan semua orang.

Jenis pekerjaan ini. Saya punya banyak mesin AC yang melakukan git-pull dari 'master' M. Mereka melakukan git push untuk mengirim data kembali.

Masalahnya muncul jika saya melakukan pengembangan pada master. Pertama, saya tidak tahu bagaimana cara mendapatkan repo pusat untuk menyediakan versi terbaru tanpa melakukannya

git reset --hard HEAD

yang sepertinya agak berlebihan. Dan jika saya melakukan pengembangan pada mesin pusat sebelum mengatur ulang, saya tidak yakin bagaimana menggabungkannya dengan perubahan yang telah didorong ke atas.

Sesuatu tentang model mental saya jauh. Tolong?

Alex Feinman
sumber
Ketika Anda mengatakan "master", apakah Anda berbicara tentang repositori master atau tentang cabang master?
innaM
master repository
Alex Feinman
1
"master" dalam konteks git biasanya adalah nama dari cabang default.
innaM
ini mungkin milik SO
Ken Liu

Jawaban:

30

Anda ingin repositori pusat Anda kosong. Katakanlah mesin yang digunakannya dinamai static:

$ ssh static git init --bare /git/myproject.git

Repositori kosong ini adalah titik pertemuan sentral: ini untuk mendorong dan menarik dari, bukan pengembangan.

Lakukan pengembangan Anda pada klon repositori pusat:

$ cd ~/src
$ git clone static:/git/myproject.git

Bahkan jika Anda aktif static, bekerjalah dalam klon:

$ git clone /git/myproject.git

Meskipun Anda satu-satunya yang mengerjakan repositori ini, biasakan melakukan pekerjaan Anda pada apa yang disebut dokumentasi git sebagai cabang topik . Manfaat langsung dari ini adalah membuat master tetap bersih , yaitu Anda selalu dapat menarik dari cabang master pusat ke master repositori lokal Anda saat ini tanpa penggabungan.

Sebagai contoh:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

Itu mungkin tidak terlihat seperti masalah besar, tetapi memberi Anda kebebasan untuk meninggalkan proyek sebagaimana diwakili di cabang itu dalam keadaan setengah matang, atau jika ide keren Anda ternyata gagal, Anda dapat dengan mudah membuang cabang itu tanpa melanggar hal lain dalam proyek Anda yang sudah bekerja di cabang lain. Mulligan gratis tak terbatas!

Mungkin Anda pulang malam itu dan menambahkan fitur baru. Pagi berikutnya, kamu

$ git checkout master
$ git pull

untuk memperbarui master lokal Anda untuk mencerminkan apa yang ada di repositori pusat.

Tetapi sekarang katakan Anda telah memperbaiki bug foo dan siap untuk memasukkannya ke cabang master Anda. Pertama Anda ingin mengintegrasikannya dengan perubahan dari tadi malam:

$ git checkout fix-bug-in-foo
$ git rebase master

The rebaseperintah membuat tampilan repositori Anda seolah-olah Anda tetap bug foo di atas fitur baru semalam. (Ini semacam suka svn update, tetapi lebih fleksibel dan kuat.)

Sekarang untuk memasukkannya ke master utama Anda:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

Kami telah memperlakukan master sebagai istimewa, tetapi itu hanya konvensional. Anda dapat berbagi pekerjaan di berbagai cabang repositori yang berbeda melalui repositori git staticdengan mudah.

Greg Bacon
sumber
1
Jawaban yang luar biasa, menyelesaikan semua masalah yang ada.
Dan Loewenherz
Instalasi git saya tidak menerima --bare sebagai opsi untuk git init (versi lama ??), tetapi saya mengatasinya dengan mengkloning --barang repo saya yang ada, dan kemudian secara manual mengedit file konfigurasi sedikit.
Alex Feinman
Jika Anda menjalankan git 1.6.4.x, tidak git init --bareada argumen lain. Ini akan menggunakan direktori kerja saat ini atau pengaturan lingkungan GIT_DIR jika diatur. Saya percaya Anda perlu git 1.6.5.x untuk mengambil argumen direktori.
Darren Hall
4
Itulah penjelasan alur kerja git terbaik yang pernah saya lihat sejauh ini untuk pekerjaan yang saya lakukan.
Greg Graham
8

Jika Anda memiliki server pusat dengan repositori central git, repositori tersebut haruslah barerepositori. Repositori kosong tidak memiliki salinan file yang berfungsi di dalamnya. Akibatnya, jika Anda bekerja pada mesin pusat itu, Anda tidak bekerja dengan repositori pusat secara langsung, tetapi dengan klon lokal.

innaM
sumber
6

Jawaban ini mirip dengan jawaban gbacon , tetapi mengambil pendekatan bahwa Anda sudah memiliki pengaturan repo lokal, dan ingin membuat master jarak jauh yang diperlakukan sebagai repo pusat. Itu hanya menambahkan detail dari pendekatan yang berbeda.

Saya menggunakan git untuk menyimpan file dot-config saya. Saya mendorong dan menarik dari apa yang saya anggap sebagai 'repo sentral'. Cukup mudah untuk mengatur ulang semua file dot saya melalui beberapa komputer.

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

Ini menciptakan repo kosong kosong di situs repo.

Sekarang jika saya sudah memiliki repo yang ada secara lokal, saya bisa mendorongnya ke situs remote.

$ cd ~/src/dotconf

chdir ke direktori lokal.

$ git remote add origin ssh://example.com/~/dotconf.git

Tambahkan repo jarak jauh sebagai asal, jadi tekan / tarik akan bertindak atas repo itu.

$ git push origin master

Dorong master saya ke titik asal (seperti yang sebelumnya diberi label melalui remote git). Sekarang repo jarak jauh diperlakukan sebagai 'repo sentral' saya. Semua push / pull git saya akan berinteraksi dengan asal.

Jika saya pergi ke host lain, saya dapat dengan mudah menarik melalui klon yang repo ke lokasi baru.

$ git clone ssh://example.com/~/dotconf.git

Jika saya ingin melakukan pengembangan DI server jauh, saya mengkloning dulu, lalu mendorong / menarik kembali ke repo telanjang.

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

Anda mungkin harus mengatur git config --add branch.master.remote originsehingga git pullAnda tidak mengeluh bahwa Anda tidak cukup spesifik. Alternatif lainnya adalah dengan mengatur cabang master Anda ke --trackasal yang jauh. Berguna jika Anda memiliki banyak cabang.

Aula Darren
sumber
1

Saya baru saja meneliti masalah yang sama hari ini. Posting blog ini memiliki banyak diskusi tentang masalah ini, tetapi pendapat mayoritas adalah untuk melakukan apa yang dikatakan Manni. Lihatlah komentar pada pos oleh David French untuk beberapa kemungkinan lain, termasuk apa yang harus dilakukan jika Anda akhirnya secara keliru mendorong ke repositori yang tidak memiliki komitmen kerja dalam indeks atau pohon kerja. "git reset –soft HEAD ^" akan mendukung perubahan yang didorong tanpa mengganggu pekerjaan Anda.

Greg Graham
sumber
2
Satu masalah dengan posting blog itu adalah melompati kegunaan indeks. Berikut adalah artikel yang bagus untuk menjelaskan cara bekerja dengan git alih-alih terlepas dari git - osteele.com/archives/2008/05/my-git-workflow - diagram alur kerja disertakan.
Darren Hall