Каков самый быстрый способ работы в git через медленное сетевое соединение?

вот сценарий: на работе у нас довольно много филиалов, и мы не сохранили РЕПО так аккуратно, как должны, иногда добавляя/удаляя большие файлы или что-то еще, и редко удаляя мертвые ветви.

Итак, сегодня снежный день, и я должен работать из дома. У меня медленное VPN-соединение, и все, что мне нужно, это самый быстрый способ добраться до одной ветви, о которой я забочусь, и начать работать, с возможностью толкать коммиты назад.

в SVN, я бы просто обновил пути / файлы, которые мне нужны, и работали бы в кратчайшие сроки. Как и у большинства новичков git, у меня есть только несколько надежных команд, и мой резервный клон git или git pull будут слишком медленными.

так вроде бы две части вопрос:

  1. как клонировать репо, чтобы работать как можно быстрее, и
  2. как мне вытащить / нажать из этого РЕПО (edit, commit, pull, push)

рабочий раствор (в @g19fanatic предложения ниже):

> mkdir <project_name>
> cd <project_name>
> git clone -b <branchname> <repo_url> --depth=1
remote: Counting objects: 16679, done.
remote: Compressing objects: 100% (11926/11926), done.
remote: Total 16679 (delta 6936), reused 10919 (delta 3337)
Receiving objects: 100% (16679/16679), 628.12 MiB | 430 KiB/s, done.
Resolving deltas: 100% (6936/6936), done.
> git pull
Already up-to-date.

(сделайте небольшое изменение на другой машине, commit/push)

> git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0)

отлично, это сработало.

единственная проблема заключается в том, что он передал в два раза больше данных изначально, чем ниже попытки, но он оставил РЕПО в пригодном для использования состоянии. Я рассмотрю этот ответ, но я думаю, что может быть улучшение первоначального размера передачи.

первая неудачная попытка:

Часть 1. кажется, лучше всего решить с помощью:

вместо git клонирования всего РЕПО со всеми его ветвями и историей создайте новое пустое РЕПО и извлеките одну ветвь, о которой я забочусь, с глубиной 1 (Без истории):

mkdir <project_name>
cd <project_name>
git init
git fetch --depth=1 <repo_url> <branchname>:refs/remotes/origin/<branchname>
git checkout <branchname>

это было здорово, так как он выполнял гораздо меньшую сетевую передачу, чем полный клон git или pull.

но теперь у меня проблемы с частью 2) вытягивание и выталкивание из этого мелкого репозитория. Мои коллеги делают небольшие обновления в течение дня, как и я, поэтому можно быстро тянуть и толкать эти маленькие постепенные изменения. Но когда я пытаюсь настроить ветку как отслеживание пульта дистанционного управления, git pull пытается вытащить полную историю. Даже запуск pull или fetch с --depth 1, похоже, хочет снова перенести все снимки (вместо небольших инкрементных изменений).

так что же мне делать в такой ситуации? (Помимо очевидного-очистите РЕПО, удаление старых элементов истории и мертвых ветвей.)

вторая неудачная попытка (в соответствии с предложениями @g19fanatic ниже):

идя с предложением @g19fanatic, я создал РЕПО, используя

> mkdir <project_name>
> cd <project_name>
> git init
> git remote add origin <repo_url>
> git pull origin <branchname> --depth=1
remote: Counting objects: 9403, done.
remote: Compressing objects: 100% (6675/6675), done.
remote: Total 9403 (delta 2806), reused 7217 (delta 2136)
Receiving objects: 100% (9404/9403), 325.63 MiB | 206 KiB/s, done.
Resolving deltas: 100% (2806/2806), done.
...

это создало ветку отслеживания и правильно вытащило только историю 1 ветви (~9400 объектов, 325MB, тогда как полное РЕПО составляет ~46k объектов). Однако, опять же, я не могу потянуть Git, не потянув больше информации, чем я считаю необходимым вытянуть. Я думаю, что смогу вытащить своих коллег всего за несколько объектов и несколько килобайт. Но вот что я вижу:--7-->

> git pull origin <branchname>
remote: Counting objects: 45028, done.
remote: Compressing objects: ... ^C

это должно было вытащить все объекты во всем РЕПО, поэтому я сломал его. Я попробовал тянуть с аргументом --depth=1:

> git pull origin <branchname> --depth=1
remote: Counting objects: 9870, done.
remote: Compressing objects: 100% (7045/7045), done.
Receiving objects:   4% (430/9870), 4.20 MiB | 186 KiB/s ^C

9k+ объекты будут похожи на начальное притяжение, но я дал ему немного, потому что думал, что некоторые из этих объектов уже будут существовать локально. Однако после того, как он передал 4+ MB, я нарушил эту команду, потому что, похоже, снова делает всю передачу. Помните, я ожидаю небольших обновлений от своих коллег, и у меня нет времени каждый раз вытаскивать 300MB.

1 ответов


делая небольшой тест здесь, я смог сделать следующее...

у нас есть общий -- голый РЕПО в сети

у меня есть удаленная установка как git remote add origin <pathToSharedRepo>
я делаю git pull origin <branch> --depth=1 (не git fetch но git pull)

это успешно тянет только коммиты" HEAD + depth " для этой ветви. Я могу сделать фиксацию на этом и таком, а затем нажать (git push должно работать просто отлично) он возвращается без проблем.

чтобы вытащить новые коммиты и просто новые коммиты из общего РЕПО, я должен явно ввести git pull origin <branch>. Поскольку это способ, которым я изначально сделал pull (явно), я должен сделать то же самое на этот раз...

это не должно тянуть вниз больше истории, чем глубина, которую вы первоначально установили (это не волнует)


чтобы быть полным, вы также можете сделать настройку глубины при клонировании РЕПО:
git clone -b <branch> <pathToRepo> --depth=<numCommitsWanted>