如何将“正常” Git存储库转换为裸存储库?
主要区别似乎是:
在普通的Git存储库中,您
.git
在存储库中有一个文件夹,其中包含构成您的工作副本的所有相关数据和所有其他文件在裸露的Git存储库中,没有工作副本,并且该文件夹(我们称之为
repo.git
)包含实际的存储库数据
如何将“正常” Git存储库转换为裸存储库?
主要区别似乎是:
在普通的Git存储库中,您.git
在存储库中有一个文件夹,其中包含构成您的工作副本的所有相关数据和所有其他文件
在裸露的Git存储库中,没有工作副本,并且该文件夹(我们称之为repo.git
)包含实际的存储库数据
Answers:
总之:更换的内容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
与对新位置进行操作不同(请参见下文)。
core.bare
。现在,在搜索了该选项之后,我可以确认它:kernel.org/pub/software/scm/git-core/docs/git-config.html
git clone --bare /path/to/repo
)下的答案要复杂和脆弱得多。
rm
命令可能* \.[!.]*
不是*
删除点文件和点目录所必需的。
您的方法看起来可行。裸存储库的文件结构就是.git目录中的文件结构。但是我不知道是否真的更改了任何文件,所以如果失败,您可以做
git clone --bare /path/to/repo
您可能需要在其他目录中执行此操作以避免名称冲突,然后可以将其移回所需位置。而且,您可能需要更改配置文件以指向原始存储库所在的位置。
git clone --bare /path/to/repo.git /path/to/newbarerepo.git
git update-server-info
在创建后在裸仓库上运行,就可以使用。
除非您特别想要或需要缠绕文件系统上的位,否则创建裸版本的非裸存储库确实非常简单(在其他几篇文章中提到)。它是git核心功能的一部分:
git clone --bare existing_repo_path bare_repo_path
也请考虑使用
git clone --mirror path_to_source_repository
从文档中:
设置源存储库的镜像。这意味着-裸露。与--bare相比,--mirror不仅将源的本地分支映射到目标的本地分支,还映射所有引用(包括远程跟踪分支,注释等),并设置一个refspec配置,以便所有这些引用被目标存储库中的git远程更新覆盖。
clone
)。我想念什么吗?是--mirror
最近才加入的吗?
--mirror
它可以从1.7版获得,因此已经相当长了。您可以在这里查看
我认为这是最安全,最简单的方法。上面没有任何内容。我只想看到一个显示安全分步过程的答案。您从要裸露的存储库(仓库)中启动一个文件夹。我采用了上面隐含的约定,即裸仓库文件夹的扩展名为.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
简单阅读
Pro Git书:4.2服务器上的Git-在服务器上获取Git
归结为
$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
然后将my_project.git放到服务器上
主要是#42的答案试图指出。也许有人可以彻底改造轮子;-)
这是一个BASH小功能,您可以在基于UNIX的系统上将它添加到.bashrc或.profile中。添加后,shell将重新启动,或者通过调用source ~/.profile
或重新加载文件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的裸仓库中
git clone --bare /path/to/normal/repo
接下来删除指向/ path / to / normal / repo的原点
cd repo.git
git remote rm origin
最后,您可以删除原始存储库。您可以在那时将repo.git重命名为repo,但是表示git存储库的标准约定是something.git,所以我个人将其保留为这种方式。
完成所有操作后,您可以克隆新的裸仓库(实际上会创建一个普通仓库,这也是将裸仓库转换为普通仓库的方式)
当然,如果您有其他上游,则需要记下它们,并更新裸仓库以包括它。但是同样,所有这些都可以通过git命令完成。记住手册页是您的朋友。
.git
文件夹的内部。了解各个部分如何组合在一起具有很高的教育意义。
如果您的存储库中没有几个本地检出分支/ refs / heads / *和几个远程分支机构remotes / origin / *,并且如果您要将其转换为一个BARE存储库,则所有分支都位于/ refs / heads / *
您可以执行以下操作来保存历史记录。
我使用以下脚本读取了一个文本文件,该文件包含所有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推送更改
下面是一个定义纯仓库从gitglossary:
裸存储库通常是带有.git后缀的适当命名的目录,该目录没有受版本控制的任何文件的本地检出副本。也就是说,通常会出现在隐藏的.git子目录中的所有Git管理和控制文件都直接存在于repository.git目录中,而没有其他文件存在并检出。通常,公共存储库的发布者会提供裸存储库。
我到达这里是因为我正在玩“本地存储库”,并且希望能够做我想做的任何事情,就好像它是远程存储库一样。我只是在玩耍,试图学习git。我假设这是任何想阅读此答案的人的情况。
我会为一个专家的意见或某些特定的反例的爱,但它似乎只是要文件(通过一些Git的源代码里翻找,我发现后),.git/config
并设置核心属性裸露于真实,git会让你做什么您想远程处理存储库。即以下行应存在于.git/config
:
[core]
...
bare = true
...
(这大致就是该命令git config --bool core.bare true
将要执行的操作,建议您使用它来处理更复杂的情况)
我对此主张的理由是,在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();
}
我既没有时间也没有专业知识来绝对自信地说这句话,但是据我所知,如果您将bare
属性设置为true
in .git/config
,那么它应该总是返回1
。该功能的其余部分可能适用于以下情况:
稍后我将进行实验,但这似乎表明设置core.bare = true等效于从配置文件中删除core.bare并正确设置目录。
无论如何,将core.bare = true设置为肯定会允许您推送它,但是我不确定项目文件的存在是否会导致其他操作出错。这很有趣,我认为有指导意义,可以推送到存储库并查看本地发生了什么(即运行git status
并理解结果)。
哇,令人惊讶的是有这么多人参与其中,尤其是考虑到似乎并不是没有一个人停下来问这个人为什么在做他正在做的事情。
裸仓库和非裸仓库之间唯一的区别是,裸仓库版本具有工作副本。您需要裸仓库的主要原因是,如果您想将其提供给第三方,则实际上您无法直接对其进行操作,因此在某个时候您将不得不克隆该仓库。回到正常的工作副本版本。
话虽如此,要转换为裸仓库,您要做的就是确保您没有未决的提交,然后执行以下操作:
rm -R * && mv .git/* . && rm -R .git
没关系,裸仓库。
git config core.bare true
。
git config core.bare true
,就像在此答案中一样。
mv repo/.git repo.git; rm -rf repo