Як оновити своє репо?


Відповіді:


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

2
@Thomas - Так, під "не бачив" я маю на увазі git logне показує ці оновлення в голому репо. (Ні git log --all, і ні робоча репо, створена шляхом клонування голого репо - або через, git log --allабо просто переглянувши нові файли, які там повинні з’явитися). Це досить швидкий тест, щоб переконатись у собі. В основному мені просто цікаво, чого мені не вистачає.
pho79

71
Якщо ваше найвіддаленіше репо - це щось на кшталт github, куди ви не маєте доступу, не можете запустити push тощо, ви можете зробити git fetch -q origin master:masterвсередині місцевого голого репо. Це отримає новий матеріал з головного відділення github та оновить вашу локальну гілку master до нього.
Альтрей

4
@Altreus Дійсно master:masterте, що потрібно для переміщення HEAD вперед до віддаленого репо. У моєму випадку через проблему я більше не міг підключитися до нашого голого репо, тому що git був відсутній. Поки це не вирішується, я роблю зворотний тунель і піднімаюсь до центрального репо, використовуючи: git fetch ssh://localhost:8765/... master:masterі це працює як шарм. Дякую!
Естані

3
@Altreus Якщо ви хочете, щоб усі гілки тоді можете зробитиgit fetch origin *:*
JBert

71

Я створив сховище за допомогою наступної команди

git clone --bare <remote_repo>

Тоді я спробував оновити голий клон, використовуючи відповідь Томаса, але це не вийшло мені. Щоб оновити голий сховище (про що я думаю, запитував Let_Me_Be), мені довелося створити дзеркальне сховище:

git clone --mirror <remote_repo>

Тоді я міг би виконати таку команду в дзеркальному сховищі, щоб захопити оновлення основного сховища:

git fetch --all

Я натрапив на це рішення, прочитавши Mirror a Git Repository by Pulling


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 / repo також використовує цей параметр, щоб дозволити одному лайнеру git remote updateвиконувати роботу.
Пан Мінькі

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спочатку перейдете до каталогу


2
Хоча я не знаю, коли це відбувається, якщо originце не визначено, ви завжди можете замінити originчастину на шлях / URL до вашого оригінального сховища. напр.$ 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

7
Третій рядок ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') - ключ. Гарна відповідь, дякую!
петерх

2
Як сказав @peterh, відповідь git config remote.origin.fetch 'refs/heads/*:refs/heads/*'є рядком . Після натискання на цю команду я просто можу git fetchі репо синхронізується з віддаленою.
жартівник

3

Додайте голое сховище як віддалене сховище, а потім використовуйте git push.


Отже, якщо я хочу це зробити, не натискаючи, я не можу використовувати голое сховище та використовувати символічне посилання чи щось подібне?
Šimon Tóth

Натискання - це звичайний метод для передачі вмісту сховища до голого сховища, цього не потрібно уникати.
Філіп

2
Ви не завжди можете натиснути. Наприклад, якщо голий знаходиться у приватній мережі, а головний репост - публічний (на GitHub, для
зразка

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 параметр для вибору був необхідний, інакше я отримую повідомлення про помилку: "Відмова від отримання поточних реф / глав / master не-голого сховища" (див. також https://stackoverflow.com/a/19205680/4807875 )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.