我需要创建一个中央Git存储库,但我有点困惑…
我已经创建了一个裸库(在我的git服务器,机器2):
$ mkdir test_repo
$ git --bare init
现在我需要将文件从本地存储库(机器1)推送到裸存储库(机器2)。我可以通过SSH访问机器2。问题是我认为我不理解裸库的概念……
在裸库中存储代码的正确方法是什么?如何将更改从本地存储库推送到裸存储库?
拥有一个中央存储库的正确方式是拥有一个裸存储库吗?
这个题目我有点搞不懂。请给我一个提示。
我需要创建一个中央Git存储库,但我有点困惑…
我已经创建了一个裸库(在我的git服务器,机器2):
$ mkdir test_repo
$ git --bare init
现在我需要将文件从本地存储库(机器1)推送到裸存储库(机器2)。我可以通过SSH访问机器2。问题是我认为我不理解裸库的概念……
在裸库中存储代码的正确方法是什么?如何将更改从本地存储库推送到裸存储库?
拥有一个中央存储库的正确方式是拥有一个裸存储库吗?
这个题目我有点搞不懂。请给我一个提示。
当前回答
我添加这个答案是因为在到达这里之后(带着同样的问题),没有一个答案真正描述了从一无所有到完全可用的远程(裸)回购所需的所有步骤。
注意:本例使用本地路径作为裸回购的位置,但其他git协议(如OP指示的SSH)应该可以正常工作。
我试图为那些不太熟悉git的人添加一些注释。
1. 初始化裸存储库...
> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/
这将创建一个文件夹(repo.git),并将其填充为代表git repo的git文件。就目前的情况而言,这个回购是无用的——它没有提交,更重要的是,没有分支。虽然您可以克隆此回购,但不能从中提取。
接下来,我们需要创建一个工作文件夹。有几种方法可以做到这一点,这取决于您是否有现有的文件。
2 a。通过克隆空repo创建一个新的工作文件夹(没有现有文件)
git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.
只有当/path/to/work不存在或为空文件夹时,此命令才有效。 注意警告—在这个阶段,您仍然没有任何有用的东西。如果你cd /path/to/work然后运行git status,你会得到类似这样的东西:
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
但这是一个谎言。你并不是真正在master分支上(因为git分支没有返回任何东西),到目前为止,还没有提交。
接下来,在工作文件夹中复制/移动/创建一些文件,将它们添加到git中,并创建第一次提交。
> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
1 file changed, 1 insertion(+)
create mode 100644 afile.txt
git配置命令只在你还没有告诉git你是谁的时候才需要。注意,如果你现在运行git分支,你会看到主分支被列出。现在运行git status:
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working directory clean
这也是一种误导——upstream并没有“消失”,它只是还没有被创建,git分支——unset-upstream没有帮助。但这没关系,现在我们有了第一次提交,我们可以push, master将在裸回购上创建。
> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
* [new branch] master -> master
在这一点上,我们有了一个功能完整的裸回购,它可以被复制到主分支的其他地方,以及一个本地工作副本,可以进行拉和推操作。
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
2 b。从现有文件创建工作文件夹 如果你已经有一个文件夹里面有文件(所以你不能克隆到它),你可以初始化一个新的git repo,添加一个第一次提交,然后链接到裸repo。
> cd /path/to/work_with_stuff
> git init
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"
[master (root-commit) 614ab02] added stuff
20 files changed, 1431 insertions(+)
create mode 100644 stuff.txt
...
此时,我们有了第一个提交和一个本地主分支,我们需要将其转换为远程跟踪的上游分支。
> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
注意git推送上的-u标志来设置(新的)跟踪的上游分支。 就像以前一样,我们现在有了一个功能齐全的裸回购,它可以被复制到主分支的其他地方,也有一个本地工作副本,可以进行拉和推操作。
所有这些对一些人来说似乎是显而易见的,但git在最好的时候也让我感到困惑(它的错误和状态消息确实需要一些重做)-希望这将帮助其他人。
其他回答
这就足够了:
git remote add origin <url-of-bare-repo>
git push --all origin
请参阅“GIT:如何更新我的裸回购?” 注:
对于裸回购远程引用,可以使用与'origin'不同的名称。 这不会推送你的标签,你需要一个单独的git推送——tags origin。
可以执行以下命令初始化本地存储库
mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master
您应该从本地存储库处理项目,并使用服务器作为中央存储库。
您还可以阅读这篇文章,它解释了创建和维护Git存储库的各个方面。 Git初学者指南
我添加这个答案是因为在到达这里之后(带着同样的问题),没有一个答案真正描述了从一无所有到完全可用的远程(裸)回购所需的所有步骤。
注意:本例使用本地路径作为裸回购的位置,但其他git协议(如OP指示的SSH)应该可以正常工作。
我试图为那些不太熟悉git的人添加一些注释。
1. 初始化裸存储库...
> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/
这将创建一个文件夹(repo.git),并将其填充为代表git repo的git文件。就目前的情况而言,这个回购是无用的——它没有提交,更重要的是,没有分支。虽然您可以克隆此回购,但不能从中提取。
接下来,我们需要创建一个工作文件夹。有几种方法可以做到这一点,这取决于您是否有现有的文件。
2 a。通过克隆空repo创建一个新的工作文件夹(没有现有文件)
git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.
只有当/path/to/work不存在或为空文件夹时,此命令才有效。 注意警告—在这个阶段,您仍然没有任何有用的东西。如果你cd /path/to/work然后运行git status,你会得到类似这样的东西:
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
但这是一个谎言。你并不是真正在master分支上(因为git分支没有返回任何东西),到目前为止,还没有提交。
接下来,在工作文件夹中复制/移动/创建一些文件,将它们添加到git中,并创建第一次提交。
> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
1 file changed, 1 insertion(+)
create mode 100644 afile.txt
git配置命令只在你还没有告诉git你是谁的时候才需要。注意,如果你现在运行git分支,你会看到主分支被列出。现在运行git status:
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working directory clean
这也是一种误导——upstream并没有“消失”,它只是还没有被创建,git分支——unset-upstream没有帮助。但这没关系,现在我们有了第一次提交,我们可以push, master将在裸回购上创建。
> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
* [new branch] master -> master
在这一点上,我们有了一个功能完整的裸回购,它可以被复制到主分支的其他地方,以及一个本地工作副本,可以进行拉和推操作。
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
2 b。从现有文件创建工作文件夹 如果你已经有一个文件夹里面有文件(所以你不能克隆到它),你可以初始化一个新的git repo,添加一个第一次提交,然后链接到裸repo。
> cd /path/to/work_with_stuff
> git init
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"
[master (root-commit) 614ab02] added stuff
20 files changed, 1431 insertions(+)
create mode 100644 stuff.txt
...
此时,我们有了第一个提交和一个本地主分支,我们需要将其转换为远程跟踪的上游分支。
> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
注意git推送上的-u标志来设置(新的)跟踪的上游分支。 就像以前一样,我们现在有了一个功能齐全的裸回购,它可以被复制到主分支的其他地方,也有一个本地工作副本,可以进行拉和推操作。
所有这些对一些人来说似乎是显而易见的,但git在最好的时候也让我感到困惑(它的错误和状态消息确实需要一些重做)-希望这将帮助其他人。
根据Mark Longair和Roboprog的回答:
如果git版本>= 1.8
git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore
Or :
如果git版本< 1.8
mkdir .git
cd .git
git init --bare --shared=group
git config receive.denyCurrentBranch ignore
一一回答你的问题:
裸存储库是指没有工作树的存储库。这意味着它的全部内容都在。git目录中。
您只能通过从本地克隆推送到裸存储库来提交。它没有工作树,所以没有文件被修改,没有变化。
要有中央存储库,唯一的方法是有一个裸存储库。