Використання Git у кількох системах без доступу до мережі


84

Я хочу використовувати контроль версій, але через причини безпеки сервер, над яким я працюю, не має доступу до Інтернету: я можу переміщувати файли лише на флеш-накопичувачі USB. Чи можу я все-таки використовувати Git з цією установкою? Чи можу я створити невеликі виправлення, які я можу застосувати у сховищі Git?


65
У вашому заголовку написано відсутність доступу до мережі, у вашому запитанні немає доступу до Інтернету; величезна різниця.
tkausl

7
@TutuKaeen Ви можете мати локальну мережу, яка не підключена до Інтернету. Тож замість github.com ви налаштовуєте git-сервер, наприклад, 192.168.1.100 і все інше працює так само.
Agent_L

12
@TutuKaeen: Критичне питання полягає в тому, чи можливий прямий (або непрямий) мережевий зв’язок між двома машинами. Отже, у вашому випадку обидва машини є мережевими, але мережі розділені? У такому випадку відредагуйте цю інформацію у своєму запитанні.
sleske

15
@TutuKaeen Ваше питання залишається незрозумілим. Ви кажете, що хочете використовувати управління версіями, але у своїх коментарях ви вимагаєте, щоб це допомогло вам розгорнутись до виробництва. Ці питання не завжди перетинаються. Я думаю, що ви маєте хороші відповіді нижче, але в майбутньому було б корисно, якби ваше питання було більш вичерпним щодо ваших вимог, які здаються такими: "Я хочу використовувати контроль версій, моя машина розвитку не має доступу до Інтернету" він має доступ до мережі, але не до виробничої машини, і я хочу знати, як вийти з коду контролю версій на виробничу машину ".
DavidS

4
Просто видається дивним використовувати термін serverдля машини, не підключеної до жодної мережі. Це може бути просто локальна мережа навіть без доступу до Інтернету, але все ж це мережа.
Патрік Грегоріо

Відповіді:


157

Звичайно, нічого про Git не вимагає певний протокол. Стандартний клієнт просто вийшов з коробки, підтримуючи HTTP (S), SSH, користувацький протокол Git і, що важливо, локальний протокол. Це просто прокладає шлях до локального .gitкаталогу, який може бути в робочому каталозі ( /path/to/project/.git) або просто в голому каталозі ( /path/to/project.git), хоча іменування є лише умовою.

Це означає, що ви можете, звичайно, додати флешку як віддалений:

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

або в Windows:

git remote add origin F:\foo.git

Або навіть додати його як додатковий пульт із іншим ім’ям (якщо ви хочете originдесь вказувати на Інтернет-сервер):

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

Тоді ви можете просто натиснути / потягнути на / з цього пульта, як і будь-який інший.

Якщо ви прочитаєте документацію , то помітите, що є також file://протокол, який поводиться дещо інакше. Рекомендується використовувати локальний шлях, оскільки він буде використовувати деякі додаткові оптимізації - якщо ви використовуєте file://протокол, то git використовуватиме деякі стандартні мережеві компоненти (для спілкування з локальним диском), що повільніше.


50
Щоб додати цю виняткову відповідь - Можливо, варто також дослідити, використовуючи «голий» сховище на флешці. "голі" сховища не мають робочого дерева, і таким чином вирізати категорію потенційних проблем, коли вони використовуються як спільна "точка влади", що звучить як приклад використання ОП.
Залізний Гремль

5
Це file://також трохи більш гнучко. Це дозволяє використовувати деякі функції (наприклад, дрібні клони), які ви не можете з місцевим шляхом.
Остін Хеммельгарн

1
@IronGremlin Чи можете ви розширити це поняття "спільна точка влади"? Я не експерт Git, і мені цікаво, що ви маєте на увазі під цим.
Гонки легкості по орбіті

2
@LightnessRacesinOrbit - це досить густа тема, але, в основному, git поширюється, тому кожен отримує свою історію. A може попросити B про їхню версію історії, але C не знає про неї, якщо хтось не розповість. Наявність єдиного сховища для зберігання "авторитетної" історії означає, що D виступає як довідковий центр для історій. Тож, A повідомляє D про зміни, а B і C знають, щоб поговорити з D, щоб бути в курсі, а не робити речі бічних каналів між собою. Справа в тому випадку, якщо сервер OP - це C, а флешка - D, це гарантує, що сервер не залишиться поза взаємодією A / B.
Залізний Гремль

6
@LightnessRacesinOrbit Тут важливо зазначити, що голий не повинен означати авторитетного, він просто корисний у цьому контексті. Наприклад, він також корисний, оскільки, не маючи робочого дерева, це менший розмір дискового простору (або пропускної здатності). Це раніше було пекло набагато важливіше, ніж зараз, але все-таки з'являється.
Залізний Гремль

46

На одному комп’ютері нічого особливого не потрібно. Запустіть git initпотрібний каталог і працюйте з Git так, як зазвичай.

Для синхронізації сховища на декількох комп'ютерах існує кілька методів.

Спосіб 1a (взагалі немає мережі): Ви можете створити "голий сховище" на USB-накопичувачі, потім натисніть на нього і витягніть з нього так, як це було б з будь-якого іншого віддаленого сховища. Іншими словами, операції з сховищами через локальні шляхи нічим не відрізняються від операцій через URL-адреси SSH або HTTPS.

  1. Створіть "віддалений" сховище:

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. У комп’ютері 1 натисніть на нього все:

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. У комп’ютері 2 ну добре, як завжди.

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

(Ви також можете натиснути / отримати / витягнути з URL-адреси чи шляху безпосередньо).

Спосіб 1b (внутрішня мережа): Якщо у вас доступний внутрішній сервер із SSH, і якщо на ньому встановлено Git, ви можете зробити те саме, що вище , просто вкажіть SSH-адресу за допомогою синтаксису [user@]host:pathабо ssh://[user@]host/path.

  1. Створіть "віддалений" сховище, запустівши git init --bare <somepath.git>на призначеному сервері (через SSH).

  2. У комп’ютері 1 аналогічно тому, як було показано раніше.

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

    Або якщо ви віддаєте перевагу:

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. У комп'ютері 2, знову те саме, що і метод 1a.


Спосіб 2: Ви можете створити "передачі пакетів", які архівують заданий список комісій в один файл.

На жаль, команди пакетів автоматично не запам'ятовують те, що вже було поставлено в останній раз, тому потрібне ручне позначення тегів або ведення приміток. Я просто візьму приклади з посібника з git-bundle.

  1. У комп’ютері 1 створіть пакет усієї гілки:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. У комп’ютері 2 витягніть з пакета так, ніби це сховище:

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

Подальші пакети не потребують упаковки цілого master- вони можуть спакувати лише щойно додані комісії last-bundled..master.

  1. У комп’ютері 1 створіть пакет із знову доданих комітетів:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. Так само, як вище.


насправді це не було б погано для моїх цілей, також у git нічого не є "первинним", оскільки у кожного сховища є вся історія, тому ви можете відтворювати його кожен раз, коли щось піде погано
Tutu Kaeen

manual tagging or note-keeping is needed, один варіант, якщо репо не дуже великий, це:, git bundle create my.bundle --allвін повинен містити все
пташиний павук

Мені ця відповідь більше подобається, бо вона більш наочна, хоча прийнята відповідь і це говорить те саме.
Ристраум

Яке значення має "голий" варіант?
Гонки легкості по орбіті

1
Він створює сховище, яке є лише базою даних (те, що ви зазвичай знаходите в .git/прихованій папці), без "робочого дерева" (редаговані файли). Це краща форма для сховищ, до яких потрібно git push.
grawity

20

git bundle create

Одним із методів є використання зовнішнього сховища для обміну даними між сховищами - це git bundle . Таким чином, у вас є лише окремі файли для кожної передачі, а не проміжні сховища Git.

Кожен "git push" перетворюється на створення файлу, "git fetch" отримує речі з цього файлу.

Демонстраційна сесія

Створення першого сховища та перше натискання

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)

"клонування" до другого сховища (тобто другого комп'ютера):

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

gitbundletest$ cd repo2/

repo2$ cat 1
1

Внесення змін та "переміщення" їх до іншого файлу пакету:

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)

"витягування" змін до першого сховища:

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

На відміну від першого пакета, другий містить лише часткову історію Git і не підлягає прямому доступу:

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

У використанні пакетів є недоліком, який потрібно вручну вказати, який діапазон комісій повинен містити кожен пакет. На відміну від цього git push, git bundleне слідкуйте за тим, що було в попередньому пакеті, вам потрібно вручну відрегулювати refs/remotes/origin/masterабо пакети були б більшими, ніж могли бути.


Не забудьте згадати --allпрапор, щоб отримати все. Якщо РЕПО досить мало, це найпростіший процес, оскільки ви просто переносите все щоразу! Просто не втрачайте флешку пам'яті - напевно, найбільша проблема безпеки!
Філіп Оклі

7

Спочатку потрібно встановити Git . Потім, щоб створити нове сховище, запустіть всередині папки, яку ви скопіювали:

git init

Тоді ви можете додати файли, якими ви хочете керувати версіями git add(додати -aдля всіх файлів) та почати вносити зміни ( git commit).

Вам не доведеться натискати на будь-який віддалений, оскільки ви можете працювати над своєю локальною історією ( git log).

Для отримання додаткової інформації перевірте:


Натискання / тягнення без Інтернету

За допомогою git pushкоманди можна натиснути на SSH (використовуючи локальне з'єднання, інтранет):

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

або натискання в папку:

git push /mnt/usb/my_repo

Це передбачає, що у вас є дві копії вашого сховища.

Те саме з витягуванням, наприклад

git pull /mnt/usb/my_repo

Виправлення

Щоб застосувати виправлення, ви можете скористатися patchкомандою або git apply.

Див.: Створіть патч або розрізний файл із сховища git та застосуйте його до іншого сховища git .


5

Ви також можете використовувати Git місцево. Тоді ваші комітети зберігаються лише локально, і ви все ще маєте керування версіями з ним (і може відрізнятися / об'єднуватись тощо), але ви просто не можете отримати доступ до сховища з будь-якого іншого комп'ютера.

Ви можете запустити локальне сховище Git, запустивши git initу локальну папку. Як описано тут .


3
що я знаю, але я хочу працювати на іншому комп’ютері і застосувати його до файлів на сервері без доступу до Інтернету
Tutu Kaeen

2
@TutuKaeen Я не бачу нічого поганого в тому, щоб мати сховище на флешці та просто клонувати / синхронізувати його на жорсткі диски різних комп'ютерів. Однак "сервер без доступу до Інтернету" звучить дивно, метою сервера є надання послуги, найчастіше послуга пов'язана з мережею (але не завжди, справді).
AnonymousLurker

2
@dhae - Будь ласка, знайдіть трохи інформації про те, як локально користуватися Git. Тільки вказівка, що це можна зробити, не є корисною для відповіді.
Рамхаунд

2
@anonymousLurker сервіс подає дані у закриту мережу у дуже важливій установі. Він просто не служить для широкого Інтернету, оскільки дані дуже делікатні і лише для працівників.
Туту Каін,

1
@TutuKaeen: Якщо є якийсь - або доступ до мережі, ви завжди можете запустити свій власний сервер Git через SSH. У Git є більше, ніж просто GitHub.
grawity
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.