Menggunakan Git di beberapa sistem tanpa akses jaringan

84

Saya ingin menggunakan kontrol versi tetapi, karena alasan keamanan, server yang saya kerjakan tidak memiliki akses internet: Saya hanya dapat memindahkan file pada USB flash drive. Masih bisakah saya menggunakan Git dengan pengaturan ini? Bisakah saya membuat tambalan kecil yang bisa saya terapkan di repositori Git?

Tutu Kaeen
sumber
65
Judul Anda mengatakan tidak ada akses jaringan, pertanyaan Anda mengatakan tidak ada akses internet; perbedaan besar.
tkausl
7
@TutuKaeen Anda dapat memiliki jaringan lokal yang tidak terhubung ke internet. Jadi alih-alih github.com Anda mengatur server git di mis. 192.168.1.100 dan yang lainnya berfungsi sama.
Agent_L
12
@TutuKaeen: Pertanyaan penting adalah apakah komunikasi jaringan langsung (atau tidak langsung) dimungkinkan antara kedua mesin. Jadi, dalam kasus Anda, kedua mesin terhubung jaringan, tetapi jaringannya terpisah? Dalam hal ini, harap edit informasi itu ke dalam pertanyaan Anda.
sleske
15
@TutuKaeen Pertanyaan Anda masih belum jelas. Anda mengatakan Anda ingin menggunakan kontrol versi, tetapi dalam komentar Anda, Anda mengharuskan itu membantu Anda menggunakan produksi. Masalah-masalah ini tidak selalu tumpang tindih. Saya pikir Anda memiliki jawaban yang baik di bawah sekarang, tetapi di masa depan akan sangat membantu jika pertanyaan Anda lebih komprehensif tentang persyaratan Anda, yang tampaknya: "Saya ingin menggunakan kontrol versi, mesin pengembangan saya tidak memiliki akses internet, memang memiliki akses jaringan tetapi tidak ke mesin produksi, dan saya ingin tahu bagaimana cara mendapatkan kode dari kontrol versi ke mesin produksi. "
DavidS
4
Sepertinya aneh menggunakan istilah serveruntuk mesin yang tidak terhubung ke jaringan apa pun. Itu bisa saja jaringan lokal bahkan tanpa akses internet tapi tetap saja jaringan.
Patrick Gregorio

Jawaban:

157

Tentu, tidak ada apa-apa tentang Git yang memerlukan protokol tertentu. Tepat di luar kotak klien standar mendukung HTTP (S), SSH, protokol custom Git dan, yang penting, protokol lokal . Itu hanya membutuhkan jalur ke .gitdirektori lokal , yang bisa berada di dalam direktori kerja ( /path/to/project/.git) atau hanya direktori kosong ( /path/to/project.git), meskipun penamaannya hanya sebuah konvensi.

Ini berarti Anda tentu saja dapat menambahkan flash drive sebagai remote:

git remote add origin /mnt/flashdrive/foo.git

atau, di Windows:

git remote add origin F:\foo.git

Atau bahkan menambahkannya sebagai remote tambahan dengan nama yang berbeda (jika Anda lebih suka originmenunjuk ke server Internet di suatu tempat):

git remote add flashdrive /mnt/flashdrive/foo.git

Kemudian Anda bisa mendorong / menarik ke / dari remote ini sama seperti yang lain.

Jika Anda membaca dokumentasi , Anda akan melihat ada juga file://protokol yang berperilaku sedikit berbeda. Disarankan untuk menggunakan jalur lokal karena akan menggunakan beberapa optimisasi tambahan - jika Anda menggunakan file://protokol maka git akan menggunakan beberapa komponen jaringan standar (untuk berbicara dengan disk lokal), yang lebih lambat.

Bob
sumber
50
Untuk menambah jawaban yang luar biasa ini - Mungkin bermanfaat untuk menyelidiki dengan menggunakan 'telanjang' pada flash drive. repositori 'telanjang' tidak memiliki pohon kerja, dan dengan demikian hilangkan kategori masalah potensial ketika digunakan sebagai 'titik otoritas' bersama, yang terdengar seperti kasus penggunaan OP.
Iron GREMLIN
5
Ini file://juga sedikit lebih fleksibel. Ini memungkinkan Anda untuk menggunakan beberapa fitur (seperti klon dangkal) yang tidak dapat Anda gunakan dengan jalur lokal.
Austin Hemmelgarn
1
@IronGremlin Bisakah Anda memperluas gagasan "titik otoritas bersama" ini? Saya bukan ahli Git dan saya ingin tahu apa yang Anda maksud dengan itu.
Lightness Races dalam Orbit
2
@LightnessRacesinOrbit - Ini adalah topik yang cukup padat, tetapi, pada dasarnya, git didistribusikan, sehingga semua orang mendapatkan sejarahnya sendiri. A dapat menanyakan versi sejarah B mereka, tetapi C tidak mengetahuinya kecuali seseorang memberi tahu mereka. Memiliki satu repositori untuk menyimpan sejarah 'otoritatif' berarti D bertindak sebagai rumah kliring untuk sejarah. Jadi, A memberi tahu D tentang perubahan, dan B dan C tahu untuk berbicara dengan D agar tetap up to date, daripada melakukan hal-hal sisi-saluran di antara mereka sendiri. Contohnya, jika server OP adalah C, dan flash drive adalah D, itu memastikan server tidak ketinggalan interaksi A / B.
Iron GREMLIN
6
@LightnessRacesinOrbit Penting untuk dicatat di sini bahwa telanjang tidak harus berarti berwibawa, itu hanya berguna dalam konteks itu. Misalnya, ini juga berguna karena, karena kekurangan pohon yang berfungsi, ini adalah ruang disk (atau bandwidth) yang lebih kecil. Ini dulunya jauh lebih penting daripada sekarang, tetapi masih muncul.
Iron GREMLIN
46

Pada satu komputer, tidak ada yang istimewa yang diperlukan. Jalankan git initdi direktori yang Anda inginkan dan bekerja dengan Git seperti biasa.

Untuk menyinkronkan repositori di beberapa komputer, ada beberapa metode.

Metode 1a (tidak ada jaringan sama sekali): Anda dapat membuat 'repositori telanjang' pada stik USB, lalu dorong ke sana dan tarik dari sana seperti halnya dengan repositori jarak jauh lainnya. Dengan kata lain, operasi repositori melalui jalur lokal tidak ada bedanya dengan operasi melalui SSH atau HTTPS URL.

  1. Buat repositori 'jarak jauh':

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. Di komputer 1, dorong semuanya ke sana:

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. Di komputer 2, yah, sama seperti biasanya.

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(Anda juga bisa mendorong / mengambil / menarik dari URL atau jalur.)

Metode 1b (jaringan internal): Jika Anda memiliki server internal dengan SSH tersedia, dan jika sudah menginstal Git, Anda dapat melakukan hal yang sama seperti di atas , cukup tentukan alamat SSH menggunakan sintaks [user@]host:pathatau ssh://[user@]host/path.

  1. Buat repositori 'jarak jauh' dengan menjalankan git init --bare <somepath.git>server yang ditunjuk (via SSH).

  2. Di komputer 1, cara yang sama seperti yang ditunjukkan sebelumnya.

    $ git remote add origin myserver.example.com:Gits/Large_Project.git
    

    Atau jika Anda lebih suka:

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. Di komputer 2, sekali lagi sama dengan metode 1a.


Metode 2: Anda dapat membuat 'transfer bundel' yang mengarsipkan daftar komitmen yang diberikan ke dalam satu file.

Sayangnya, perintah bundel tidak secara otomatis mengingat apa yang sudah dibundel terakhir kali, sehingga penandaan manual atau pencatatan diperlukan. Saya hanya akan mengambil contoh dari manual git-bundle.

  1. Di komputer 1, buat bundel seluruh cabang:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. Di komputer 2, tarik dari bundel seolah-olah itu adalah repositori:

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

Bundel berikutnya tidak perlu mengemas keseluruhan master- mereka dapat mengemas hanya dari komit yang baru ditambahkan last-bundled..master.

  1. Di komputer 1, buat bundel komit yang baru ditambahkan:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. Sama seperti di atas.

grawity
sumber
sebenarnya itu tidak akan buruk untuk tujuan saya, juga di git tidak ada yang "primer" karena setiap repositori memiliki seluruh sejarah, sehingga Anda dapat menciptakannya kembali setiap kali ada yang buruk
Tutu Kaeen
manual tagging or note-keeping is needed, satu pilihan kecuali repo sangat besar adalah git bundle create my.bundle --all
:,
Saya lebih suka jawaban ini karena lebih ilustratif meskipun jawaban yang diterima dan ini mengatakan hal yang sama.
Rystraum
Apa pentingnya opsi "telanjang"?
Lightness Races dalam Orbit
1
Itu membuat repositori yang hanya database (apa yang biasanya Anda temukan di .git/folder tersembunyi), tanpa 'pohon kerja' (file yang dapat diedit). Itu adalah bentuk yang disukai untuk repositori yang Anda inginkan git push.
grawity
20

git bundle create

Salah satu metode adalah dengan menggunakan penyimpanan eksternal untuk bertukar data antara repositori adalah git bundle . Dengan cara ini Anda hanya memiliki satu file untuk setiap transfer, bukan repositori Git menengah.

Setiap "git push" berubah menjadi pembuatan file, "git fetch" mengambil sesuatu dari file itu.

Sesi demo

Membuat repositori pertama dan melakukan "push" pertama

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

"kloning" ke repositori kedua (yaitu komputer kedua):

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

Melakukan beberapa perubahan dan "mendorong" mereka ke file bundel lain:

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

"menarik" perubahan ke repositori pertama:

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

Berbeda dengan bundel pertama, bundel kedua hanya berisi sebagian riwayat Git dan tidak dapat dikloning secara langsung:

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

Ada kerugian dalam menggunakan bundel yang harus Anda tentukan secara manual berapa kisaran komit yang harus dikandung setiap bundel. Tidak seperti git push, git bundletidak melacak apa yang ada di bundel sebelumnya, Anda perlu menyesuaikan secara manual refs/remotes/origin/masteratau bundel akan lebih besar dari yang seharusnya.

Vi.
sumber
Jangan lupa menyebutkan --allbendera untuk mendapatkan semuanya. Jika repo cukup kecil, ini adalah proses paling sederhana karena Anda cukup mentransfer semuanya setiap waktu! Hanya saja, jangan kehilangan memory stick - mungkin masalah keamanan terbesar!
Philip Oakley
7

Anda harus menginstal Git terlebih dahulu . Kemudian untuk membuat repositori baru, jalankan di dalam folder yang telah Anda salin:

git init

Kemudian Anda dapat menambahkan file yang ingin Anda kontrol versi git add(tambahkan -auntuk semua file) dan mulai melakukan perubahan ( git commit).

Anda tidak harus mendorong ke kendali jarak jauh, karena Anda dapat mengerjakan riwayat lokal Anda ( git log).

Untuk informasi lebih lanjut, periksa:


Mendorong / menarik tanpa internet

Menggunakan git pushperintah, dimungkinkan untuk mendorong SSH (menggunakan koneksi lokal, intranet):

git remote add server ssh://[user@]host.xz[:port]/path/to/dev/repo.git/
git push server

atau mendorong ke folder:

git push /mnt/usb/my_repo

Ini mengasumsikan Anda memiliki dua salinan repositori Anda.

Sama dengan menarik, misalnya

git pull /mnt/usb/my_repo

Menambal

Untuk menerapkan tambalan, Anda dapat menggunakan patchperintah atau git apply.

Lihat: Membuat file tambalan atau berbeda dari repositori git dan menerapkannya ke repositori git lain .

kenorb
sumber
5

Anda dapat menggunakan Git secara lokal juga. Kemudian komit Anda hanya disimpan secara lokal, dan Anda masih memiliki kontrol versi dengannya (dan dapat berbeda / lain-lain), tetapi Anda tidak dapat mengakses repositori dari komputer lain.

Anda dapat memulai repositori Git lokal dengan menjalankan git initdi folder lokal Anda. Seperti dijelaskan di sini .

dhae
sumber
3
yang saya tahu, tetapi saya ingin bekerja di komputer lain dan menerapkannya pada file di server tanpa akses internet
Tutu Kaeen
2
@TutuKaeen Saya tidak melihat ada masalah dengan memiliki repositori pada flash drive dan hanya mengkloning / menyinkronkannya ke hard drive komputer yang berbeda. Namun, "server tanpa akses internet" terdengar aneh, tujuan server adalah untuk menyediakan layanan, paling sering layanan ini terkait dengan jaringan (tetapi tidak selalu, memang).
AnonymousLurker
2
@hae - Harap luangkan waktu sejenak untuk memberikan detail lebih lanjut tentang cara menggunakan Git secara lokal. Hanya menunjukkan itu bisa dilakukan tidak membantu jawaban.
Ramhound
2
@anonymousLurker yang melayani melayani data ke jaringan tertutup di institusi yang sangat penting. Itu hanya tidak melayani apa pun ke internet yang luas, karena datanya sangat halus dan hanya untuk karyawan.
Tutu Kaeen
1
@TutuKaeen: Jika memiliki setiap akses jaringan, Anda selalu bisa menjalankan server Git Anda sendiri melalui SSH. Ada lebih banyak untuk Git daripada hanya GitHub.
grawity