如何将git存储库移到另一个目录并将该目录作为git存储库?


100

我有一个目录gitrepo1。这个目录是一个git仓库。

  • 我想将此gitrepo1移到另一个目录newrepo

  • 目录newrepo应该是不丢失git历史记录的新git存储库,并且应包含目录gitrepo1

  • 目录gitrepo1现在应该只是一个目录(在newrepo内部),没有任何.git索引,即它不再应该是独立的git存储库或子模块。

我怎样才能做到这一点?


9
mv girepo1 newrepo??
ddavison 2013年

Answers:


108

非常简单 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 repo使其不可用(尽管已很容易纠正)。
AD7six 2013年

1
我在Windows机器上并使用命令提示符。我找不到“ cp”命令。“ cp”命令是特定于其他操作系统的吗?
LP13

1
@ user3862378,cp就像几乎每个命令或功能都特定于其他操作系统一样。实际上,它特定于不是Windows的每个操作系统。尝试致电Microsoft,并询问他们为什么不是POSIX。无论如何,cp意味着复制。mv意味着移动。rm表示删除。您可以找到等效的Windows。
Shahbaz 2015年

@Shahbaz谢谢,上面的解决方案创建了以下结构“ newrepo->。git”和“ newrepo-> gitrepo1中的所有其他文件” ...它没有将“ gitrepo1”文件夹放在“ newrepo”中..我很好奇在Windows中手动创建文件夹并在根文件夹下移动“ .git”文件夹。
LP13

2
@ user3862378,没有理由不应该这样做。.git/包含所有历史记录,其中包括您的最新提交。无论放在哪里,都拥有所有的历史。实际上,如果该目录中的所有文件都与您从中获取的原始存储库不同.git/,那么唯一的事情就是它会告诉您某些文件已被删除而一些未跟踪的文件存在。使用git reset --hard,删除的文件将自动恢复!唯一需要注意的是,仅通过复制.git/就无法恢复未提交的更改。
沙巴兹(Shahbaz)2015年

4

有点晚了,问题已经回答了,但是要做到没有任何头痛:

  1. 使用来检查您在较旧的git文件夹中当前的分支是什么git status,比如说分支开发
  2. 将目录更改为新的git文件夹,然后git clone将项目从repo更改为新的文件夹
  3. 在新文件夹中签出当前分支: git checkout development
  4. 使用rsync,将新文件夹与旧文件夹同步,.git文件夹除外rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

那您就可以继续从上次停下来的地方


1

比这更简单。就是这样做的(在Windows上,但是应该在其他OS上也可以):

  1. 创建newrepo
  2. gitrepo1移到newrepo中
  3. .gitgitrepo1移到newrepo(上一层)。
  4. 提交更改(根据需要修复跟踪)。

Git只是看到您添加了目录并重命名了一堆文件。没关系


0

我不是专家,但是我将.git文件夹复制到一个新文件夹,然后调用: git reset --HARD

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.