як створити нове сховище git з існуючого


77

У мене є віддалене сховище git, яке справді замінило все, що ми мали в іншому старому SCM. Багато проектів та продуктів було додано до сховища протягом багатьох років.

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

Git remote додає рішення? Я хочу, щоб обидва ці сховища були на одному сервері.

Думки?

Відповіді:


80

Для того, щоб створити нове сховище Git з існуючого сховища, як правило, слід створити нове вільне сховище і висунути одну або кілька гілок із існуючого в нове сховище.

Наступні кроки ілюструють це:

  1. Створіть нове сховище. Воно повинно бути оголеним , щоб ви могли до нього натиснути.

    $ mkdir /path/to/new_repo
    $ cd /path/to/new_repo
    $ git --bare init

    Примітка : переконайтеся, що ваше нове сховище доступне з існуючого сховища. Існує багато способів зробити це; припустимо, що ви зробили його доступним через ssh://my_host/new_repo.

  2. Висуньте гілку з вашого існуючого сховища. Наприклад, скажімо, ми хочемо витіснити гілку topic1з існуючого сховища та назвати її masterновим сховищем.

    $ cd /path/to/existing_repo
    $ git push ssh://my_host/new_repo +topic1:master

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

Примітка: нове сховище фактично є новим віддаленим сховищем. Якщо ви хочете працювати з новим сховищем, ви повинні його клонувати. Далі буде клоновано нове репо в локальний робочий каталог під назвою new_repo:

$ git clone ssh://my_host/new_repo

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


10
Якщо ви будете регулярно натискати на віддалене репо, це, мабуть, хороша порада git remote add origin ssh://my_host/new_repo. Таким чином, ви просто робите git push origin [branchname]. При використанні git remote add origin "//server_name/myapp/"
файлових папок

Чи може нове сховище бути доступним як локальний каталог / сховище? Чи існують методи оновлення для цього?
Нікос Александріс

@NikosAlexandrisris Я додав нову інформацію, сподіваюся, що це допоможе. Також зауважте, що не має значення, що новий репо знаходиться на віддаленому сервері. У прикладі ми натискаємо і клонуємо, використовуючи sshпротокол; але ми могли б аналогічно використовувати fileпротокол, який створив би нове сховище в тій же файловій системі.
pestrella

22

Витягніть гілку вниз, як звичайно, а потім відсуньте гілку до нового сховища, яке ви створили за допомогою git init. Ви б використовували код, який виглядає приблизно так:

git push url:///new/repo.git TheBranchFolder

Цей метод також зберігає всі ваші попередні зміни, якщо це є плюсом для ситуації.


Я використовую ssh-доступ до свого репо, чи можу я використати це замість URL-адреси у вашій відповіді?
Реза

reza: так, подумайте про URL-адресу ssh як про інший тип URL-адреси.
amcnabb

отже, на сервері git я видав git push / home / git / newBranchGIT ім'я гілки .... Тепер, що я бачу, це репозиторій git, який має все, що мені потрібно, але єдина гілка тепер називається ім'ям гілки, а не джерелом чи майстром. Я хочу, щоб ім'я гілки було головним. Або є кращий спосіб зробити це?
Реза

Просто змініть ім'я, як хочете, і зобов'яжіться.
JustinDoesWork

21

Якщо вас не турбує втрата історії, виконайте a, git checkout mybranchа потім скопіюйте вміст каталогу в іншу папку. У цій папці видаліть папку .git, а потім:

git init; git commit -a -m "Imported from project Y"

2
чи буде це зберігати історію комітів оригінального репо?
Mike Graf

18
@MikeGraf: Ні, як зазначено у першій частині першого речення у відповіді: "Якщо вас не турбує втрата історії ..."
Джастін ᚅᚔᚈᚄᚒᚔ

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