Здесь сценарий: на работе у нас довольно много веток, и мы не сохранили репо как аккуратно, как должны, иногда добавляем/удаляем большие файлы или что-то еще, и редко удаляем мертвые ветки.
Итак, сегодня день снега, и я должен работать из дома. У меня медленное 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 МБ каждый раз.