Как переместить репозиторий git в другой каталог и сделать этот каталог репозиторием git?

101

У меня есть каталог gitrepo1 . Этот каталог является репозиторием git.

  • Я хотел бы переместить этот gitrepo1 в другой каталог newrepo .

  • Каталог newrepo должен быть новым репозиторием git без потери истории git и должен содержать каталог gitrepo1 .

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

Как я могу это сделать?

Пранджал Миттал
источник
9
mv girepo1 newrepo??
ddavison

Ответы:

110

Все очень просто. 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значит удалить. Вы можете найти эквиваленты Windows.
Shahbaz
@Shahbaz Спасибо, приведенное выше решение создает следующую структуру «newrepo ->. Git» и «newrepo-> все остальные файлы из gitrepo1» ... это не помещает папку «gitrepo1» в «newrepo» .. Мне любопытно, если создание папок вручную в окнах и перемещение папки ".git" в корневую папку .. будет ли работать, не затрагивая историю?
LP13,
2
@ user3862378, нет причин, по которым этого не должно быть. .git/содержит всю историю, включая вашу последнюю фиксацию. Куда бы вы это ни поместили, у вас есть вся история. Фактически, если все файлы в этом каталоге отличаются от исходного репо, из которого вы взяли .git/, единственное, что он говорит вам, что некоторые файлы удалены, а некоторые присутствуют. С a git reset --hardудаленные файлы будут восстановлены автоматически! Единственное, что следует отметить, это то, что просто скопировав, .git/вы не сможете восстановить незафиксированные изменения.
Shahbaz
4

Немного поздно, и на вопрос уже дан ответ, но, чтобы сделать это без головной боли:

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

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

Эмремра
источник
2

Это даже проще, чем это. Просто сделал это (в Windows, но он должен работать в другой ОС):

  1. Создать новое репо .
  2. Переместите gitrepo1 в newrepo .
  3. Переместите .git из gitrepo1 в newrepo (на один уровень выше).
  4. Зафиксируйте изменения (при необходимости исправьте отслеживание).

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

david.pfx
источник
1

Я не эксперт, но я копирую папку .git в новую папку, а затем вызываю: git reset --HARD

Перезагрузить Вселенную
источник