如何将一个正常的Git仓库转换为裸机?

我怎样才能将一个“正常”的Git仓库转换为裸机?

主要区别似乎是:

  • 在正常的git仓库中,仓库中有一个.git文件夹,其中包含所有相关数据,所有其他文件构建您的工作副本

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

简而言之:将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 

请注意,这不同于做一个git clone --bare是一个新的位置(见下文)。

你的方法看起来像是可行的; 裸存储库的文件结构正是.git目录中的内容。 但我不知道是否有任何文件实际上是改变的,所以如果失败了,你可以做

 git clone --bare /path/to/repo 

您可能需要在不同的目录中执行此操作以避免名称冲突,然后您可以将其移回到您想要的位置。 你可能需要改变配置文件指向你的原点回购的地方。

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

GitFaq:我如何使现有的非裸仓库裸露?

 $ mv repo/.git repo.git $ git --git-dir=repo.git config core.bare true $ rm -rf repo 

除非你特别想要或者需要在文件系统上添加位,否则创建一个非裸版本库(在这里提到的其他几篇文章)真的很简单。 这是git核心功能的一部分:

git clone --bare reponame bare_reponame

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

 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 

这将使repos/.git的内容成为裸机

我只是想推到一个网络路径上的存储库,但git不会让我这样做,除非该存储库被标记为裸露。 我所需要的只是改变它的配置:

 git config --bool core.bare true 

除非你想保持清洁,否则不需要摆弄这些文件。

这是我认为最安全和最简单的。 这里没有任何东西没有在上面陈述。 我只想看到一个答案,显示一个安全的分步过程。 从仓库(仓库)开始,您要裸露一个文件夹。 我采用了上面隐含的惯例,裸仓库文件夹有一个.git扩展名。

 (1) Backup, just in case. (a) > mkdir backup (b) > cd backup (c) > git clone ../repo (2) Make it bare, then move it (a) > cd ../repo (b) > git config --bool core.bare true (c) > mv .git ../repo.git (3) Confirm the bare repository works (optional, since we have a backup) (a) > cd .. (b) > mkdir test (c) > cd test (d) > git clone ../repo.git (4) Clean up (a) > rm -Rf repo (b) (optional) > rm -Rf backup/repo (c) (optional) > rm -Rf test/repo 

这里有一个BASH函数可以添加到基于UNIX系统的.bashrc或.profile文件中。 一旦添加,shell就重新启动,或者通过调用source ~/.profilesource ~/.bashrc来重新加载文件。

 function gitToBare() { if [ -d ".git" ]; then DIR="`pwd`" mv .git .. rm -fr * mv ../.git . mv .git/* . rmdir .git git config --bool core.bare true cd .. mv "${DIR}" "${DIR}.git" printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to " printf "bare and renamed to\n ${DIR}.git\n" cd "${DIR}.git" else printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n" fi } 

一旦在包含.git目录的目录中调用,它将进行适当的更改以转换存储库。 如果调用时不存在.git目录,则会显示FAILURE消息,并且不会发生文件系统更改。

简单阅读

Pro Git Book:服务器上的Git 4.2 – 在服务器上获取Git

下降到

 $ git clone --bare my_project my_project.git Cloning into bare repository 'my_project.git'... done. 

然后把my_project.git到服务器

主要是哪个答案#42试图指出。 舒适地可以重新发明轮子;-)

也请考虑使用

 git clone --mirror path_to_source_repository 

从文档 :

设置源代码库的镜像。 这意味着 – 不要。 与–bare相比,–mirror不仅将源的本地分支映射到目标的本地分支,还映射所有的参考(包括远程跟踪分支,注释等),并建立一个refspec配置,使得所有这些参考被目标存储库中的git远程更新覆盖。

那些说删除文件和移动.git目录的方法是不干净的,不要使用“git”方法来做一些简单的事情。 这是我发现将一个正常的回购转换为裸回购的最干净的方法。

首先克隆/路径/到/正常/回购进入裸回购称为repo.git

 git clone --bare /path/to/normal/repo 

接下来删除指向/ path / to / normal / repo的原点

 cd repo.git git remote rm origin 

最后,你可以删除你原来的回购。 你可以在这个时候把repo.git重新命名为repo,但是标准的git仓库是一些东西,所以我会亲自离开它。

一旦你完成了所有这一切,你可以克隆你的新的裸回购(这实际上创造了一个正常的回购,也是如何将其从裸到正常)

当然,如果你有其他的上游,你会想记下它们,并更新你的裸回购包括它。 但是,这一切都可以用git命令来完成。 记住手册页是你的朋友。

我使用以下脚本来阅读一个文本文件,其中包含我所有的SVN回购列表,并将其转换为GIT,然后使用git clone –bare将其转换为纯粹的git回购

 #!/bin/bash file="list.txt" while IFS= read -r repo_name do printf '%s\n' "$repo_name" sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name sudo git clone --bare /programs/git/$repo_name $repo_name.git sudo chown -R www-data:www-data $repo_name.git sudo rm -rf $repo_name done <"$file" 

list.txt有格式

 repo1_name repo2_name 

而users.txt有格式

(no author) = Prince Rogers <prince.rogers.nelson@payesley.park.org>

www-data是Apache Web服务器用户,需要权限才能通过HTTP推送更改

如果你有一个本地签出分支很少的仓库/ refs / heads / *和一些远程分支分支remotes / origin / *,如果你想把它转换成一个所有分支在/ refs / heads / *的BARE仓库,

您可以执行以下操作来保存历史记录。

  1. 创建一个裸仓库
  2. cd进入本地签出分支机构和远程分支机构的仓库
  3. git push / path / to / bare / repo + refs / remotes / origin / :refs / heads /

首先, backup你现有的回购:

 (a) mkdir backup (b) cd backup (c) git clone non_bare_repo 

其次,运行以下内容:

 git clone --bare -l non_bare_repo new_bare_repo 

Oneliner负责所有上述操作:

 for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true 

(不要怪我,如果有事情发生,你没有备份:P)

哇,有多少人对此表示惊讶,尤其是考虑到似乎并没有一个人停下来问为什么这个人正在做他在做什么。

裸和非裸Git仓库之间唯一的区别是非裸版本有一个工作副本。 你需要一个裸回购的主要原因是如果你想把它提供给第三方,你实际上不能直接处理它,所以在某些时候你必须克隆它,回到正常的工作拷贝版本。

这就是说,要转换为裸回购所有你必须做的是确保你没有提交悬而未决,然后只是:

 rm -R * && mv .git/* . && rm -R .git 

有你去,裸回购。