如何在裸 Git 存储库中创建主分支?

68
git init --bare test-repo.git
cd test-repo.git

(文件夹中包含与git相关的文件和文件夹)

git status

致命错误:此操作必须在工作树中运行 (好的,所以我不能在裸库中使用git status;我猜这很有道理)

git branch

(似乎什么也没有,裸库似乎不包含任何分支。我是否需要从克隆的库中添加它们?)

cd ..
mkdir test-clone
cd test-clone
git clone ../test-repo.git

(我收到有关克隆空代码库的警告)

cd test-repo

提示改变以指示我正在主分支上。

git branch

(没有显示结果 - 嗯?)

git branch master

致命错误:无效的对象名称:“master”

嗯,那么我该如何在我的裸仓库中创建主分支?


为什么 Git 在空目录中无法创建主分支?我们必须在目录中创建一些内容,然后主分支才会出现,为什么有这种限制?这个设计逻辑令人难以置信。 - Clock ZHONG
4个回答

85

裸库一般只用于推送和拉取代码。你不能在其中进行太多直接的操作,例如:无法检出代码、创建引用(分支、标签)、运行 git status 等。

如果你想在裸 Git 仓库中创建一个新分支,你可以从克隆体中推送一个分支到你的裸仓库:

# initialize your bare repo
$ git init --bare test-repo.git

# clone it and cd to the clone's root directory
$ git clone test-repo.git/ test-clone
Cloning into 'test-clone'...
warning: You appear to have cloned an empty repository.
done.
$ cd test-clone

# make an initial commit in the clone
$ touch README.md
$ git add . 
$ git commit -m "add README"
[master (root-commit) 65aab0e] add README
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

# push to origin (i.e. your bare repo)
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 219 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/jubobs/test-repo.git/
 * [new branch]      master -> master

对我不起作用。测试克隆>git commit -m“添加README” 在主分支上最初的提交未跟踪的文件: README.md没有要提交的内容,但存在未跟踪的文件 - Lawrence DeSouza
1
@LawrenceDeSouza 你很可能忘记了执行 git add . - jub0bs

32

分支只是对提交的引用。在将任何内容提交到存储库之前,您没有任何分支。您也可以在非裸存储库中看到这一点。

$ mkdir repo
$ cd repo
$ git init
Initialized empty Git repository in /home/me/repo/.git/
$ git branch
$ touch foo
$ git add foo
$ git commit -m "new file"
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
$ git branch
* master

3
一个分支只是一个指向提交的引用。谢谢,这确实有助于解释事情! - David
如果您已经有文件,请使用 git add -A * 将它们添加到其中。 - codeslapper

14

不需要使用第二个仓库 - 只需使用 --work-tree 选项提供一个虚拟的工作目录,就可以在裸仓库上执行像git checkoutgit commit这样的命令。

准备一个虚拟目录:

$ rm -rf /tmp/empty_directory
$ mkdir  /tmp/empty_directory

创建没有父节点的master分支(即使在完全空的存储库上也可以工作):
$ cd your-bare-repository.git

$ git checkout --work-tree=/tmp/empty_directory --orphan master
Switched to a new branch 'master'                  <--- abort if "master" already exists

创建一个提交(它可以只是一条仅包含消息的提交,而不添加任何文件,因为你只需要至少有一个提交):

$ git commit -m "Initial commit" --allow-empty --work-tree=/tmp/empty_directory 

$ git branch
* master

清理目录,它仍然是空的。

$ rmdir  /tmp/empty_directory

在 git 1.9.1 上进行了测试。(对于 OP,posh-git 只是标准 git 的 PowerShell 封装。)


4
“孤儿”标志是我所需要的。谢谢! - SwankyLegg
1
我喜欢那种方法(出于脚本原因)。我会检查它是否有效,并很快回来给你一个加一的评价。 :) - DrBeco

-2

默认情况下,不会列出任何分支,并且只有在放置某些文件后才会弹出。您不必过多担心它。只需运行所有命令,如创建文件夹结构、添加/删除文件、提交文件、将其推送到服务器或创建分支即可。它可以无缝地工作,没有任何问题。

https://git-scm.com/docs


1
一个“裸仓库”不是那样工作的。https://git-scm.com/docs/git-clone#git-clone---bare - jub0bs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接