Як дублювати сховище git? (без роздрібнення)


117

У мене є два сховища, і мені потрібно скопіювати ціле одне на друге порожнє, яке має різні рівні доступу від першого. Копія та материнське сховище не повинні бути пов'язані між собою.

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


5
не впевнений, але я думаю, що ви можете просто його клонувати, а потім використовувати git config remote.origin.url git: //new.url/proj.git, щоб встановити remote.origin на ваш новий представник.
Руфінус

я щойно опублікував посилання робить щось подібне.
nbz

@rudinus Я зробив саме це. Дякую.
ковбойбебоп

Відповіді:


205

Побачити https://help.github.com/articles/duplicating-a-repository

Коротка версія:

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

mkdir foo; cd foo 
# move to a scratch dir

git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

cd ..
rm -rf old-repository.git  
# Remove our temporary local repository

ПРИМІТКА: вищезазначене буде добре працювати з будь-яким віддаленим git repo, інструкції не стосуються github

Сказане створює нову віддалену копію репо. Потім клонуйте його до робочої машини.


2
Що станеться, якщо старі та нові сховища мали однакову назву (не однакову URL-адресу git). Як і я, я просто Jeremy.gitJeremy.git
клонуюсь

Це не буде точним дублікатом. Випуски не передаватимуться.
Шлем

Чи зберігає це історію?
Томас

@Thomas Я щойно це зробив і так, це зберегло всю мою історію в копії. Зауважте, що після того, як ви натиснете і впустите компакт-диск у нове репо, все ще нічого немає, тому що ви натиснули на пульт, тому вам потрібно зробити тягнення
PfunnyGuy

7
Щоб відповісти на роботу з GitHub, спочатку потрібно створити новий репозиторій на GitHub.
Алекс Холкомб

23

Ви також можете використовувати git-copy .

Встановіть його за допомогою Gem,

gem install git-copy

Тоді

git copy https://github.com/exampleuser/old-repository.git \
    https://github.com/exampleuser/new-repository.git

1
Як ви в першу чергу встановите дорогоцінний камінь? Це здається самим безпроблемним рішенням. Оголошено!
saran3h

Зазвичай це частина встановлення Ruby. На Ubuntu робити sudo apt install ruby.
шкода

10

Якщо ви копіюєте в GitHub, ви можете скористатися імпортером GitHub, щоб зробити це за вас. Оригінальне репо може бути навіть з інших систем управління версіями.


4
Це прекрасно працює і навіть зберігає історію - слід бути більш прихильним
Джон Д

1
Я згоден. Цей підхід набагато інтуїтивніше, його можна зробити повністю в GUI Github, і не передбачає жодної з цих заплутаних дурниць командного рядка. Етапи: 1) У графічному інтерфейсі зробіть нове репо, але не натискайте прапорець з написом "Ініціалізуйте цей сховище README". Після цього Github представить вам нову сторінку та опцію з написом "... або імпортувати код з інше сховище. " Це воно!
Люк Ф.

5

Якщо ви просто хочете створити нове сховище, використовуючи всі або більшість файлів із наявного (тобто, як своєрідний шаблон), я вважаю, що найпростішим підходом є створення нового репо-файлу з потрібним іменем тощо тощо, клонування його ваш робочий стіл, а потім просто додайте в нього потрібні файли та папки.

Ви не отримуєте всю історію тощо, але, мабуть, цього не хочете в цьому випадку.


-1

Відкритий термінал.

Створіть голий клон сховища.

git clone --bare https://github.com/exampleuser/old-repository.git

Mirror-push to the new repository.

cd old-repository.git

git push --mirror https://github.com/exampleuser/new-repository.git


Я спробував ваш підхід. І я отримав це повідомлення про помилку:! [віддалений відхилений] master -> master (попередній прийом гачок відхилений) та кілька інших подібних повідомлень. Останнє було: помилка: не вдалося натиснути кілька реф. Як я можу це виправити?
LND
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.