如何将普通的Git存储库转换为裸存储库?

Bol*_*wyn 580 git version-control git-clone git-bare git-non-bare-repository

如何将"普通"Git存储库转换为裸存储库?

主要区别似乎是:

  • 在普通的git存储库中,您.git在存储库中有一个包含所有相关数据的文件夹,而所有其他文件都构建了您的工作副本

  • 在一个简单的Git存储库中,没有工作副本,文件夹(让我们称之为repo.git)包含实际的存储库数据

Jör*_*tag 580

总之:更换的内容repo一致的内容repo/.git,然后告诉它现在是一个纯仓库存储库.

为此,请执行以下命令:

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true
Run Code Online (Sandbox Code Playgroud)

请注意,这与执行git clone --bare新位置不同(参见下文).

  • 这比下面的答案(`git clone --bare/path/to/repo`)更加复杂和脆弱. (53认同)
  • 谢谢!这对我来说似乎更清晰:mv repo/.git repo.git && rm -rf repo && cd repo.git && git config --bool core.bare true (14认同)
  • 感谢`core.bare`的提示.现在,在谷歌搜索这个选项后,我可以确认一下:http://www.kernel.org/pub/software/scm/git-core/docs/git-config.html (7认同)
  • `rm`命令可能需要`*\.[!.]*`而不是`*`才能删除点文件和点目录. (7认同)
  • @Ciantic:再次,正如我在上面的评论中已经解释的那样,我的回答是在3年前给出的,但5个月前有人将问题编辑成*完全*不同的东西.*此页面上的答案没有*将会**any*sense.直接从问题中复制了这一系列命令,我刚刚添加了最后两行. (6认同)
  • @Boldewyn指向确认core.bare部分的链接已移至:https://www.kernel.org/pub/software/scm/git/docs/git-config.html (5认同)
  • .git/index也可以删除,裸仓不需要它. (3认同)
  • 我发现这个答案:http://stackoverflow.com/a/1784612/2498188更清洁. (2认同)
  • 我尝试了这个和以下克隆选项,结果不同.此外,维基建议使用克隆方法,请参阅https://git.wiki.kernel.org/index.php/Git_FAQ#How_do_I_make_existing_non-bare_repository_bare.3F (2认同)
  • 如果您要转换的存储库恰好是现有存储库的模块,则此答案不会按书面方式工作。在这种情况下,`.git` 不是一个目录,而是一个包含你必须移动的实际 `.git` 目录路径的文件。 (2认同)

jon*_*scb 240

你的方法看起来会起作用; 裸存储库的文件结构就是.git目录中的内容.但我不知道是否有任何文件实际更改,所以如果失败,你可以这样做

git clone --bare /path/to/repo
Run Code Online (Sandbox Code Playgroud)

您可能需要在不同的目录中执行此操作以避免名称冲突,然后您可以将其移回到您想要的位置.您可能需要更改配置文件以指向您的原始仓库所在的位置.

  • 错了,这种方法不等同.执行克隆不会保留配置选项,这对正确操作至关重要,例如使用git-p4.另外,一个克隆会破坏遥控器,再次使用类似git-p4的东西,你在克隆时丢失了p4/master分支,因此上述方法更可取. (49认同)
  • 但您可以通过复制配置文件的相应部分轻松传输配置选项.我仍然认为这种方法比手动复制和重命名文件要干净. (26认同)
  • 为了避免名称冲突---`git clone --bare /path/to/repo.git/path/to/newbarerepo.git` (10认同)
  • 在颠覆迁移之后,这是完美的,因为git-svn缺乏对--bare的支持. (6认同)

xhh*_*xhh 114

我认为以下链接会有所帮助

GitFaq:如何使现有的非裸存储库裸露?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
Run Code Online (Sandbox Code Playgroud)

  • 是的,这就是我搜索的内容,谢谢!然而,他们的第二个提议(`git clone`)具有上面提到的nosatalian的缺点. (2认同)

Chi*_*aye 70

除非你特别想要或需要在文件系统上旋转位,否则创建一个非裸存储库的裸版本确实很简单(在这里的其他几篇文章中提到).它是git核心功能的一部分:

git clone --bare existing_repo_path bare_repo_path

  • 一点也不奇怪 - 这个答案没有做原始问题所要求的.它不会转换repo,它会克隆一个,在进程中丢失信息(例如,远程分支). (35认同)
  • 令人惊讶的是,在4个月之后,这个遥远的最佳答案有0票.不太好但危险的"接受的答案"有200个! (6认同)
  • 当然,这引出了一个问题:为什么 Git 首先是有损的(是的,我知道 `git clone --mirror`),但据我所知,英语中 _clone_ 的含义并不是“重复,除了这些”随机未指定的部分”...当然,Git 子命令的含义并不总是完全不言自明的,所以我想我期望英文子命令遵循单词的英文含义,这在 Git 上是错误的。 (3认同)

Jac*_*zyk 14

还请考虑使用

git clone --mirror path_to_source_repository
Run Code Online (Sandbox Code Playgroud)

文档:

设置源存储库的镜像.这意味着 - 不好.与--bare相比, - mirror不仅将源的本地分支映射到目标的本地分支,它还映射所有引用(包括远程跟踪分支,注释等)并设置refspec配置,以便所有这些引用被目标存储库中的git远程更新覆盖.

  • 似乎这是做 OP 想要做的事情的最简洁、完整和安全的方式(而不是“克隆”)。我错过了什么吗?`--mirror` 是最近添加的吗? (2认同)
  • @CraigSilver:不,正如我在文档历史记录中看到的那样,`--mirror` 在 1.7 版中可用,所以已经很长了。你可以查看[这里](https://git-scm.com/docs/git-clone/1.7.12.4) (2认同)
  • 读完这个答案后,有些人可能想读这个问题:/sf/ask/277194711/ (2认同)

Sli*_*ion 7

我只是想推送到网络路径上的存储库,但git不会让我这样做,除非该存储库被标记为裸.我只需要更改其配置:

git config --bool core.bare true
Run Code Online (Sandbox Code Playgroud)

除非你想保持文件清洁,否则无需摆弄文件.

  • 当您还想要处理远程仓库的工作树时,这很危险.很可能,您迟早会因为远程工作树和索引与存储库不同步而还原更改.如果你没有_exactly_知道你在做什么,我不推荐这个解决方案. (3认同)

Dan*_* D. 6

我已经阅读了答案,我已经这样做了:

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like
Run Code Online (Sandbox Code Playgroud)

这将留下repos/.git裸露的内容repos.git