Подтвердить что ты не робот

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

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

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

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

Итак, это вопрос двух частей:

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

Рабочее решение (по следующим предложениям @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.

(сделайте небольшое изменение на другом компьютере, зафиксируйте/нажмите)

> 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 объектов, 325 МБ, тогда как полное репо - ~ 46 тыс. объектов). Однако, опять же, я не могу показаться git тянуть, не вытаскивая больше информации, чем я считаю, нужно тянуть. Я думаю, что мне удастся заставить моих коллег совершить совершение нескольких объектов и несколько килобайт. Но вот что я вижу:

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

Это собиралось вытащить все объекты во всем репо, поэтому я сломал его. Я попробовал pull с аргументом --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+ МБ, я нарушил эту команду, потому что, похоже, он снова переносит всю передачу. Помните, я ожидаю небольшие обновления от своих коллег, и у меня нет времени вытаскивать 300 МБ каждый раз.

4b9b3361

Ответ 1

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

У нас есть общий -bare репо в сети

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

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

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

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


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

Ответ 2

Есть несколько способов уменьшить пропускную способность:

  • клонировать только нужную вам ветку (--single-branch, эта предназначена только для клонирования, а не вытягивания; при вытягивании вы можете указать нужную ветку)
  • клонировать только самые последние версии файлов (--depth 1, как и вы). Это подразумевает --single-branch по умолчанию.
  • клонировать только те файлы, которые вам нужны (редкая проверка, например, здесь)

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

#!/bin/bash

until $( git pull --depth=1 origin master ); do        # <-- pull command goes here
    echo "Pulling repository failed; retrying..."
done

Конечно, перед извлечением вам нужно сначала инициализировать репо:

git init <dir>
cd <dir>
git remote add origin <repo_url>