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

Pra*_*tal 83 git

我有一个目录gitrepo1.该目录是一个git存储库.

  • 我想将这个gitrepo1移动到另一个目录newrepo.

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

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

我怎样才能做到这一点?

Sha*_*baz 94

这很简单.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
Run Code Online (Sandbox Code Playgroud)

请注意,如果存储库很大且历史很长,则副本非常昂贵.您也可以轻松避免它:

# 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 -
Run Code Online (Sandbox Code Playgroud)

创建后newrepo,要放置的目标gitrepo1可以在任何地方,甚至在内部newrepo也可以.它不会改变程序,只会改变您要写gitrepo1回的路径.

  • +1.可能值得一提的是[此问题](http://stackoverflow.com/a/17747571/761202)影响使用git版本1.7.8或1.7.9创建的存储库 - 这可能意味着移动git repo使其无法使用(尽管如此表明它很容易纠正). (6认同)
  • @user3862378,`cp`,就像几乎每个命令或功能都特定于其他操作系统一样。事实上,它特定于不是 Windows 的每个操作系统。尝试致电微软并询问他们为什么不是 POSIX。无论如何,`cp` 的意思是复制。`mv` 表示移动。`rm` 表示删除。您可以找到 Windows 等效项。 (3认同)
  • @ user3862378,没有理由不应该这样做.`.git /`包含所有历史记录,其中包括您的最新提交.无论你把它放在哪里,你都拥有所有的历史.事实上,如果该目录中的所有文件与您从中获取`.git /`的原始repo不同,那么唯一的事情就是它会告诉您某些文件被删除而一些未跟踪的文件存在.使用`git reset --hard`,删除的文件将自动恢复!唯一需要注意的是,只需复制`.git /`就无法恢复未提交的更改. (2认同)

dav*_*pfx 16

它甚至比这更简单。刚刚这样做(在 Windows 上,但它应该适用于其他操作系统):

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

Git 只是看到您添加了一个目录并重命名了一堆文件。没什么大不了的。

  • @Marses:Tnx。(我仍然不敢相信我回答了 git 问题!) (6认同)
  • 对我来说,这似乎是正确的答案(与公认的答案不同,它不会导致 git 历史记录的丢失)。 (2认同)

ReB*_*rse 6

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

  • 不对。孔历史记录得以保留。尝试一下。 (2认同)

emr*_*rah 5

要做到这一点而没有任何头痛:

  1. 检查什么是在当前分支gitrepo1git status,比方说分支“发展”
  2. 将目录更改为newrepo,然后git clone是存储库中的项目。
  3. newrepo中的分支切换到上一个分支:git checkout development.
  4. newrepo与旧的同步,gitrepo1使用rsync不包括 .git 文件夹rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1。你rsync当然不必这样做,但它做得非常顺利。

好处:

您很高兴从上次中断的地方继续:您的旧分支、未暂存的更改等。