Как мне обновить мой репо?

134

Я создал чистое репо для публикации своего репозитория, но я не могу понять, как обновить чистое репо с текущим состоянием основного репозитория.

Шимон Тот
источник
2
См. Этот ответ: stackoverflow.com/questions/315911/…
Кен Блум

Ответы:

83

Если вы хотите дублировать все объекты из основного репо, сделайте это внутри основного репо:

git push --all <url-of-bare-repo>

В качестве альтернативы выполните выборку внутри открытого репо:

git fetch <url-of-main-repo>

Вы не можете выполнить вытягивание, потому что пул хочет слиться с ним HEAD, чего нет в голом репо.

Вы можете добавить их как пульты дистанционного управления, чтобы не печатать в будущем:

git remote add <whatever-name> <url-of-other-repo>

Тогда вы можете просто сделать

git push --all <whatever-name>

или

git fetch <whatever-name>

в зависимости от вашего репо. Если <whatever-name> есть origin, то вы можете даже оставить его в целом.

Отказ от ответственности: я не мерзавец. Если я сказал что-то не так, я хотел бы быть просветленным!

Обновление: читайте комментарии!

Томас
источник
7
Когда я делал git-fetch --allвнутри голого репозитория, я не видел обновлений, которые я сделал для основного репо, но когда я нажимаю их из основного репозитория с помощью, git push --all <url-of-bare-repo>я вижу обновления в git log. По-видимому, этому есть простое объяснение - может кто-нибудь объяснить?
pho79 01
2
@Thomas - Да, под "не видел" я имел в виду, git logчто эти обновления не отображаются в чистом репо. (Ни то git log --all, ни другое не делает , как и рабочее репо, созданное путем клонирования чистого репо - либо через, git log --allлибо просто просматривая новые файлы, которые должны там появиться). Это довольно быстрый тест, чтобы убедиться в этом. В основном мне просто любопытно, что мне не хватает.
pho79
71
Если ваше удаленное репо похоже на github, где у вас нет доступа, вы не можете запустить push и т. Д., Вы можете сделать это git fetch -q origin master:masterвнутри своего локального голого репо. Это приведет к получению нового материала из главной ветки github и обновлению вашей локальной главной ветки.
Altreus
4
@Altreus В самом деле, master:masterэто то, что требуется для перемещения HEAD вперед к заголовку удаленного репо. В моем случае из-за проблемы я больше не мог подключиться к нашему голому репо, потому что отсутствовал git. Пока он не будет решен, я использую обратный туннель и получаю данные в центральном репо, используя: git fetch ssh://localhost:8765/... master:masterи это работает как шарм. Спасибо!
estani
3
@Altreus Если вам нужны все ветки, вы можете сделать этоgit fetch origin *:*
JBert
71

Я создал репозиторий, используя следующую команду

git clone --bare <remote_repo>

Затем я попытался обновить голый клон, используя ответ Томаса, но у меня это не сработало. Чтобы обновить чистый репозиторий (как я думаю, Let_Me_Be просил), мне пришлось создать зеркальный репозиторий:

git clone --mirror <remote_repo>

Затем я мог запустить следующую команду в зеркальном репозитории, чтобы получить обновления основного репозитория:

git fetch --all

Я наткнулся на это решение, прочитав Зеркало репозитория Git, потянув

Остен
источник
22
Чтобы изменить существующее голое репо на зеркало, все, что вам нужно сделать, это добавить 2 строки в файл конфигурации git в <REPO> .git / config. В [remote "origin"]разделе добавляем fetch = +refs/*:refs/*иmirror = true
Исаак Бетеш
@IsaacBetesh Ты спас мне день :)
smc
54

Единственное решение помимо воссоздания с git clone --mirror - от Грегора :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

тогда вы сможете, git fetchи вы увидите обновления. Странно то, что до этого, даже при наличии remoteнастроенного, в нем не было веток, перечисленных в git branch -a.

Колин Д Беннетт
источник
1
Это действительно помогло мне! Проект / репозиторий Capistrano также использует этот параметр, чтобы разрешить однострочное git remote updateвыполнение работы.
Minqi Pan
1
Если на пульте дистанционного управления есть принудительно обновленные или удаленные ветки (и вы хотите отразить эти изменения), вам может потребоваться добавить --forceи --pruneсоответственно в git fetchстроку.
Эллиотт Слотер,
46

Предполагая, что:

$ git clone --bare https://github.com/.../foo.git

Получить с:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Примечание: --git-dir=foo.gitне требуется, если вы cdсначала зашли в каталог.

antak
источник
2
Хотя я не знаю, когда это произойдет, если originне определено, вы всегда можете заменить originчасть на путь / URL-адрес вашего исходного репозитория. eg$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak
Это именно то, что я искал. Это сработало отлично.
Максим Руиллер
13

После долгих экспериментов я обнаружил, что это работает для меня.

Однажды:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Каждый раз, когда я хочу синхронизировать:

cd /home/myhome/repo.git
git --bare fetch ssh://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site
simonvc
источник
7
Третья строка ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') - это ключ. Хороший ответ, спасибо!
Питер - Восстановить Монику
2
Как сказал @peterh, линия git config remote.origin.fetch 'refs/heads/*:refs/heads/*'- это ответ. После нажатия этой команды я могу просто git fetchсинхронизировать репо с удаленным.
joker
3

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

Philipp
источник
Итак, если я хочу сделать это, не нажимая, я не могу использовать чистый репозиторий и использовать символическую ссылку или что-то в этом роде?
Шимон Тот,
Распространение - это нормальный метод переноса содержимого репозитория в чистый репозиторий, этого не нужно избегать.
Филипп
2
Вы не всегда можете давить. Например, если голое хранилище находится в частной сети, а основные репозитории являются общедоступными (например, на GitHub)
fanf42
0

Для меня эта комбинация сработала:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

-u параметр для выборки был необходим, в противном случае я получаю сообщение об ошибке: «Отказ от выборки в текущую ветку refs / Heads / master не-голого репозитория» (см. также https://stackoverflow.com/a/19205680/4807875 )

Александр Самойлов
источник