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

我有一个目录 Gitrepo1。这个目录是一个 git 存储库。

  • 我想将这个 Gitrepo1移动到另一个目录 Newrepo

  • 目录 Newrepo应该是没有丢失 git 历史的新 git 存储库,并且应该包含目录 Gitrepo1

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

我怎么能这么做?

232255 次浏览

很简单。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的路径。

毫不费力地做到这一点:

  1. 检查 Gitrepo1git status的当前分支是什么,我们假设是 “发展”分支。
  2. 将目录更改为 Newrepo,然后从存储库中将项目 git clone
  3. Newrepo中的分支切换到前一个分支: git checkout development
  4. 使用 rsync不包括. git 文件夹: rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1同步 Newrepo和旧的 Gitrepo1。你当然不需要用 rsync做这个,但是它做得很流畅。

好处:

您可以在中断的地方继续进行: 您的旧分支、未分阶段的更改等等。

它甚至比这还要简单,只是这样做(在 Windows 上,但是在其他操作系统上应该可以工作) :

  1. 创建 Newrepo
  2. Gitrepo1移到 Newrepo
  3. 。 gitGitrepo1移动到 Newrepo(上升一级)。
  4. 提交更改(根据需要修复跟踪)。

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

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

将 git 存储库移动到另一个目录并使用镜像方法使该目录成为 git 存储库的简单方法

git clone --mirror git@example.com/mirror-repository.git

cd mirror-repository.git

使用以下命令将更改推送到新的存储库

git push --mirror git@example.com/new-mirror.git

这将获得镜像存储库中可用的所有分支和标记,并将它们复制到新位置。

不要使用 git push ——存储库中的镜像,这些存储库不是由—— Mirror 克隆的。它将使用本地引用(和本地分支)覆盖远程存储库。Git 克隆——镜像优于 git 克隆——裸,因为前者也克隆 git 注释和其他一些属性。

对于我来说,在 windows 上使用 xcopy.copy 命令不会复制隐藏的文件。 从根文件夹运行以下命令:

xcopy subfolderofRepo .\ /s /e /h