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

主要的区别似乎是:

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


当前回答

补充2: 写完答案后,我意识到接受的答案可能会在我的PC上导致相同的结果,如果后面跟着git add *。

我的文件从我的工作文件夹中消失了(只剩下。git了),它又好又紧凑:

git switch --orphan some_new_branch_name 

然后转换为裸,如果你想:

git config --bool core.bare true

这样,包括远程链接在内的配置将被保存:

$ git config --list
core.repositoryformatversion=0
core.filemode=true
core.bare=true
remote.origin.url=https://github.com/vmatare/thinkfan.git
remote.origin.fetch=+refs/*:refs/*
remote.origin.mirror=true

补充道: 在评论中提到,它不会删除“任何被git忽略的文件”,这种情况下,它们需要额外手动删除(或存储库本身,即.git子文件夹被移动到其他地方)。

注: 在核心。毫无疑问,一些行为会导致错误:

$ git fetch --all
Fetching origin
fatal: Refusing to fetch into current branch refs/heads/devel of non-bare repository
error: Could not fetch origin

Some_new_branch_name在git分支的输出中没有被列出。为了进一步测试,我做了git checkout master,我得到了文件,在git分支的输出中再次没有some_new_branch_name,所以我认为新的孤儿分支不会被添加到存储库中,除非那里完成了一些工作(和/或执行了提交)。

其他回答

首先,备份你现有的回购:

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

其次,运行以下命令:

git clone --bare -l non_bare_repo new_bare_repo

我认为下面的链接会有帮助

GitFaq:如何使现有的非裸库变得裸?

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

下面是一个小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”方法来做一些应该简单的事情。这是我发现的将正常回购转换为裸回购的最干净的方法。

第一个克隆/path/to/normal/repo到一个名为repo.git的裸repo

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

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

cd repo.git
git remote rm origin

最后,您可以删除原来的回购。你可以重命名repo。在这一点上,Git的回购,但标准约定,以表示一个Git存储库是什么。git,所以我个人会这样做。

一旦你完成了所有这些,你可以克隆你的新裸回购(这实际上创建了一个正常的回购,也是你如何将它从裸转换为正常)

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

如果你有一个存储库,只有很少的本地签出分支/refs/heads/*和很少的远程分支分支/origin/* and,如果你想把它转换成一个BARE存储库,所有分支都在/refs/heads/*中

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

创建裸存储库 CD到具有本地签出分支和远程分支的本地存储库中 Git push /path/to/bare/repo +refs/remotes/origin/:refs/heads/