Я хочу использовать контроль версий, но из-за соображений безопасности сервер, на котором я работаю, не имеет доступа к Интернету: я могу перемещать файлы только с USB-накопителя. Могу ли я использовать Git с этой настройкой? Могу ли я создавать небольшие патчи, которые я могу применить к Git-репозиторию?
5 ответов
Конечно, в 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 будет использовать некоторые стандартные сетевые компоненты (для связи с локальным диском), что медленнее.
На одном компьютере ничего особенного не требуется. Запустите git init
в нужном вам каталоге и работайте с Git, как обычно.
Для синхронизации хранилища между несколькими компьютерами существует несколько способов.
Метод 1a (сети вообще нет). Вы можете создать «пустой репозиторий» на USB-накопителе, затем нажать на него и извлечь из него, как если бы это было с любым другим удаленным репозиторием. Другими словами, операции с хранилищем через локальные пути ничем не отличаются от операций через URL-адреса SSH или HTTPS.
Создайте «удаленный» репозиторий:
$ git init --bare /mnt/Stick/Repositories/Large_Project.git
В компьютере 1 нажмите на него все:
$ cd ~/Large_Project $ git remote add usb /mnt/Stick/Repositories/Large_Project.git $ git push usb master
В компе 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
синтаксис.
Создайте «удаленный» репозиторий, запустив
git init --bare <somepath.git>
на указанном сервере (через SSH).В компьютере 1 так же, как продемонстрировано ранее.
$ git remote add origin myserver.example.com:Gits/Large_Project.git
Или, если вы предпочитаете:
$ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
В компьютере 2 опять то же самое, что и в методе 1а.
Способ 2: Вы можете создать «пакеты передачи», которые заархивируют данный список коммитов в один файл.
К сожалению, команды связки не запоминают автоматически то, что уже было упаковано в прошлый раз, поэтому ручная пометка или ведение заметок необходимо. Я просто возьму примеры из руководства по git-bundle.
На компьютере 1 создайте связку всей ветви:
$ cd ~/Large_Project $ git bundle create /mnt/Stick/Project.bundle master $ git tag -f last-bundled master
На компьютере 2 вытащите из пакета, как будто это хранилище:
$ cd ~/Large_Project $ git pull /mnt/Stick/Project.bundle
Последующие связки не должны упаковывать весь master
- они могут упаковывать только недавно добавленные коммиты из last-bundled..master
вместо этого.
На компьютере 1 создайте пакет недавно добавленных коммитов:
$ cd ~/Large_Project $ git bundle create /mnt/Stick/Project.bundle last-bundled..master $ git tag -f last-bundled master
То же, что и выше.
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
или пакеты будут больше, чем могли бы быть.
Вам нужно сначала установить 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
.
Смотрите: Создайте файл патча или diff из репозитория git и примените его к другому другому репозиторию git.
Вы также можете использовать Git локально. Тогда ваши коммиты хранятся только локально, и у вас все еще есть контроль версий (и вы можете различать / объединять и т.д.), Но вы просто не можете получить доступ к хранилищу с любого другого компьютера.
Вы можете запустить локальный репозиторий Git, запустив git init
в вашей локальной папке. Как описано здесь.