Як перемістити сховище git в інший каталог і зробити цей каталог сховищем git?


101

У мене є каталог gitrepo1 . Цей каталог є сховищем git.

  • Я хотів би перемістити цей gitrepo1 в інший каталог newrepo .

  • Каталог newrepo повинен бути новим сховищем git без втрати історії git і повинен містити каталог gitrepo1 .

  • Каталог gitrepo1 повинен просто бути каталогом зараз (всередині newrepo ), без будь-якого .gitіндексу, тобто він більше НЕ повинен бути незалежним сховищем git або підмодулем.

Як я можу це зробити?


9
mv girepo1 newrepo??
ddavison

Відповіді:


109

Це дуже просто. Git не хвилює, як називається його каталог. Його хвилює лише те, що всередині. Тож ви можете просто зробити:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

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

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

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


6
+1. Напевно, варто згадати про це, що впливає на сховища, створені за допомогою git версії 1.7.8 або 1.7.9 - що може означати, що переміщення репозиторію git робить його непридатним для використання (хоча, як зазначено, це легко виправити).
AD7six,

1
я перебуваю на машині wndows і використовую командний рядок. я не зміг знайти команду "cp". команда "cp" специфічна для іншої ОС?
LP13

1
@ user3862378, cpяк майже кожна команда або функція специфічна для інших ОС. Насправді це специфічно для кожної ОС, яка не є Windows. Спробуйте зателефонувати в Microsoft і запитати їх, чому вони не POSIX. У всякому разі, cpозначає копію. mvозначає рух. rmзасоби видалити. Ви можете знайти еквіваленти вікон.
Шахбаз

@Shahbaz Дякую, наведене вище рішення створює таку структуру "newrepo ->. Git" і "newrepo-> всі інші файли з gitrepo1" ... його не поміщаючи папку "gitrepo1" всередину "newrepo" .. Мені цікаво, якщо створення папок вручну у вікнах та переміщення папки ".git" під кореневу папку .. це спрацювало б, не впливаючи на історію?
LP13

2
@ user3862378, немає жодної причини, чому б це не сталося. .git/містить всю історію, яка включає ваш останній коміт. Куди б ви його не поставили, у вас є вся історія. Насправді, якщо всі файли в цьому каталозі відрізняються від оригінального репозиторію, з якого ви взяли .git/, єдине, що він повідомляє, що деякі файли видаляються, а деякі не відстежуються. За допомогою a git reset --hardвидалені файли будуть відновлені автоматично! Єдине, на що слід звернути увагу, це те, що, просто скопіювавши, .git/ви не можете відновити незафіксовані зміни.
Шахбаз

4

Пізно вже пізно, і на питання вже відповіли, але, щоб зробити це без головного болю:

  1. Перевірте, з якою поточною гілкою ви знаходитесь у старій папці git git status, скажімо, розробка гілок
  2. Змініть каталог на нову папку git, а потім git cloneпроект з репо на нову папку
  3. Отримайте поточну гілку у вашій новій папці: git checkout development
  4. Синхронізуйте свою нову папку зі старою, використовуючи rsync, за винятком папки .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Тоді вам добре продовжувати там, де ви зупинились


1

Це навіть простіше, ніж це. Щойно зробив це (у Windows, але це повинно працювати в інших ОС):

  1. Створити newrepo .
  2. Перемістіть gitrepo1 у newrepo .
  3. Перемістіть .git з gitrepo1 на newrepo (на один рівень вище).
  4. Фіксувати зміни (виправити відстеження за необхідності).

Git просто бачить, що ви додали каталог і перейменували купу файлів. Ніякого біггі.


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