我如何将一个“正常”的Git存储库转换为一个裸库?

主要的区别似乎是:

在普通的Git存储库中,您在存储库中有一个.git文件夹,其中包含所有相关数据和构成工作副本的所有其他文件 在裸Git存储库中,没有工作副本,文件夹(让我们称之为repo.git)包含实际的存储库数据


当前回答

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

git config --bool core.bare true

除非你想保持文件整洁,否则没必要乱动。

其他回答

用于执行上述所有操作的onlineer:

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核心功能的一部分:

Git clone——bare existing_repo_path bare_repo_path

下面是一个小BASH函数,您可以将它添加到基于UNIX的系统上的.bashrc或.profile中。一旦添加,shell要么重新启动,要么通过调用source ~/重新加载文件。配置文件或源代码~/.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消息,并且不会发生文件系统更改。

哇,居然有这么多人插话,真是令人惊讶,尤其是考虑到似乎没有一个人停下来问这个人为什么要做他正在做的事情。

裸git和非裸git仓库之间的唯一区别是,非裸版本有一个工作副本。你需要裸回购的主要原因是,如果你想让第三方可以使用它,你实际上不能直接使用它,所以在某种程度上,你将不得不克隆它,此时你就会回到常规的工作副本版本。

也就是说,要转换为裸回购,你所要做的就是确保你没有提交挂起,然后:

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

这就对了,裸回购。

以下是来自gitglossary的裸库定义:

裸存储库通常是一个适当命名的、后缀为.git的目录,该目录不包含任何受修订控制的文件的本地签出副本。也就是说,通常出现在隐藏的. Git子目录中的所有Git管理和控制文件都直接出现在存储库中。取而代之的是Git目录,并且没有其他文件存在并签出。公共存储库的发布者通常会提供裸存储库。

我来到这里是因为我正在使用“本地存储库”,并希望能够像使用远程存储库一样做任何我想做的事情。我只是玩玩,想了解一下git。我假设任何想读这个答案的人都会遇到这种情况。

我想要一个专家的意见或一些具体的反例,然而,似乎(在我找到的一些git源代码中)简单地转到.git/config文件并将核心属性设置为true, git会让你远程对存储库做任何你想做的事情。例如,在.git/config中应该存在以下行:

[core]
    ...
    bare = true
...

(这大致是命令git config——bool core。完全真实就可以了,这可能是建议处理更复杂的情况)

我对这种说法的理由是,在git源代码中,似乎有两种不同的方法来测试回购是否为空。一种方法是检查全局变量is_bare_repository_cfg。这是在执行的某个设置阶段设置的,并反映在.git/config文件中找到的值。另一个是函数is_bare_repository()。下面是这个函数的定义:

int is_bare_repository(void)
{
    /* if core.bare is not 'false', let's see if there is a work tree */
    return is_bare_repository_cfg && !get_git_work_tree();
} 

我没有时间也没有专业知识来绝对自信地说这一点,但据我所知,如果你在.git/config中将裸属性设置为true,这应该总是返回1。函数的其余部分可能用于以下情况:

核心。Bare没有定义(即既非真也非假) 没有工作树(例如。git子目录是主目录)

我以后会用它做实验,但这似乎表明设置核心。Bare = true相当于去除核心。从配置文件和设置正确的目录。

无论如何,设定核心。bare = true当然会让你推到它,但我不确定项目文件的存在是否会导致一些其他操作出错。推送到存储库并查看本地发生了什么(即运行git status并理解结果)是很有趣的,我认为这很有指导意义。