Linux下搭建Git服务器

2023-05-16

目录

步骤一.安装Git:

步骤二.服务器端创建git用户(管理Git服务)

服务器端的Git配置公钥

生成rsa证书文件

步骤三.服务器端创建Git仓库

步骤四.客户端clone服务器端git仓库

1、在客户端创建本地仓库

2、客户端创建Rsa公钥和Rsa私钥

步骤五.服务器Git打开RSA认证

1、修改sshd_config文件配置

2、重启sshd服务 

3、在客户端Git Bash 下导入文件

4、设置权限(根据实际情况决定)

 步骤六.客户端再次clone(测试是否需要输入密码)

安装Gitosis之管理公钥

 安装Gitosis依赖的工具

进入到Gitosis目录执行:

出现下面的信息表示安装成功

禁止服务器某个用户通过ssh登录服务器

git init 和 git init --bare的区别

git init --bare 的特点

git init 的特点

git init容易产生冲突的地方


步骤一.安装Git:

#通过yum安装Git
yum install -y git

#查看Git版本(确认是否安装成功):
git --version

步骤二.服务器端创建git用户(管理Git服务)

  1. 如果不需要区分用户来管理git,则可以跳过此步骤(默认使用root用户来管理git)
#查看git用户是否存在
[root@wpl ~]# id git
id: git: no such user

#添加git用户
[root@wpl ~]# useradd git

#给git用户设置密码
[root@wpl ~]# echo "123" | passwd --stdin git
Changing password for user git.
passwd: all authentication tokens updated successfully.

#切换到git用户下
[root@wpl ~]# su - git
Last failed login: Mon Jan 16 10:13:48 CST 2023 from 10.10.10.38 on ssh:notty
There were 5 failed login attempts since the last successful login.

[git@wpl ~]$ 
  • 服务器端的Git配置公钥

在Windows上配置管理者,git服务器需要一些管理者,通过上传开发者机器的公钥到服务器,添加成为git服务器的管理者,打开git命令行

  • 生成rsa证书文件

[root@wpl ~]# ssh-keygen -t rsa

执行完 :ssh-keygen -t rsa 结果如下图所示

步骤三.服务器端创建Git仓库

  1. 创建Git仓库有两种方式,第一种:git init  第二种:git init --bare。

git init 和 git init --bare的区别文章最后有介绍,我这里用的是:git init --bare

#在git用户目录下创建仓库目录repositroy,并且创建project.git项目测试目录
[root@wpl home]# mkdir -p ./git/repository/project.git

#查看/home/目录下有哪些用户目录
[root@wpl home]# ll
total 4
drwx------.  7 git git  137 Jan 16 17:36 git
drwx------. 15 wpl wpl 4096 Jan 16 09:23 wpl

#进入git用户目录
[root@wpl home]# cd git/

#查看git用户目录下有哪些目录/文件
[root@wpl git]# ll
total 0
drwxr-xr-x. 3 root root 25 Jan 16 17:36 repository

#进入repository仓库目录
[root@wpl git]# cd repository/

#查看仓库目录下的项目目录
[root@wpl repository]# ll
total 0
drwxr-xr-x. 2 root root 6 Jan 16 17:36 project.git

#这步很重要,初始化项目测试目录
[root@wpl repository]# git init --bare ./project.git/
Initialized empty Git repository in /home/git/repository/project.git/

2、如果上面创建了git用户来管理git服务,则这里需要把 Git 仓库的 owner(拥有者) 修改为 git用户。执行命令:

chown -R git:git repository/

步骤四.客户端clone服务器端git仓库

  • 1、在客户端创建本地仓库

TortoiseGit的方式克隆

例如:我的本地仓库设置在:D:\PhpStudyV8\phpstudy_pro 目录下 

Git Bash的方式克隆

  1. 在D:\PhpStudyV8\phpstudy_pro目录下打开 Git Bash

Git Bash 的操作如下:

#执行 clone 命令
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro
$ git clone git@10.10.10.68:/home/git/repository/project.git
Cloning into 'project'...

#提示让输入密码(输入创建git用户时设置的密码即可)
git@10.10.10.68's password:
warning: You appear to have cloned an empty repository.


#当第一次连接到目标 Git 服务器时会提示(如果不是第一次连接,则不会出现下面的提示)
Cloning into 'test'...
The authenticity of host '10.10.10.68 (10.10.10.68)' can't be established.
ED25519 key fingerprint is SHA256:DSWcndKXrWJcGFVHIgiMKg9RBc9JHyqMI6R/eCchszw.
This key is not known by any other names

#选择yes
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

#此时 C:\Users\用户名\.ssh 下会多出一个文件 known_hosts,以后在这台电脑上再次连接目标Git服务器时不会再提示上面的语句。
Warning: Permanently added '10.10.10.68' (ED25519) to the list of known hosts.

#提示让输入密码(输入服务器root用户的密码即可)
git@10.10.10.68's password:

此时 C:\Users\用户名\.ssh 下会多出一个文件 known_hosts文件,以后在这台电脑上再次连接目标 Git 服务器时不会再提示上面的语句。

【说明】

  1. 如果你的服务器没有配置SSH连接,那么按照正常情况会让你输入root用户的密码,输入正确后就能进行项目克隆了。
  2. 如果不采用 SSH 公钥来进行验证,则每次都要输入密码,很麻烦,下面就来配置SSH公钥验证的方式来clone项目 
  • 2、客户端创建Rsa公钥和Rsa私钥

ssh-keygen -t rsa -C "test@163.com"

执行过程如下图所示

此时 C:\Users\用户名\.ssh 下会多出两个 id_rsa(私钥)和 id_rsa.pub(公钥) 文件

步骤五.服务器Git打开RSA认证

  • 1、修改sshd_config文件配置

进入 /etc/ssh 目录,编辑sshd_config,查看以下三个配置是否被注释或者存在。不存在的给添加上,被注释的,就取消注释。最后 :wq 保存并退出

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
  • 2、重启sshd服务 

service sshd restart

sshd的相关操作命令:

  1. systemctl status sshd.service  #查看ssh服务状态
  2. systemctl start sshd.service    #开启ssh服务
  3. systemctl enable sshd.service #设置ssh服务开机自启

【AuthorizedKeysFile】配置项:是公钥的存放路径

  • 3、在客户端Git Bash 下导入文件

将客户端公钥导入服务器端 .ssh/authorized_keys 文件中,执行:

#执行命令:ssh git@服务器公网IP地址 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/project (master)
$ ssh git@10.10.10.68 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

#提示让输入密码,这里输入git用户的密码即可
git@10.10.10.68's password:

再次查看服务器:/.ssh 目录,就会发现多了一个authorized_keys文件 

  • 4、设置权限(根据实际情况决定)

  1. 在设置权限之前先确认一下 .ssh目录和文件authorized_keys的权限,如果.ssh目录权限是:700 文件authorized_keys权限是:600,则不需要设置权限。
  2. 如果不是700 和 600,则执行命令:
chmod 700 /home/git/.ssh/

chmod 600 /home/git/.ssh/authorized_keys

 步骤六.客户端再次clone(测试是否需要输入密码)

EDZ@WINDOWS-6INDESP MINGW64 /d/PhpStudyV8/phpstudy_pro/git-one (master)
$ git clone git@10.10.10.68:/home/git/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.

这次克隆发现没有提示:是否需要继续链接,也没有提示让输入密码,直接就成功了。

安装Gitosis之管理公钥

  1. 如果团队很小,把每个人的公钥收集起来放到服务器的.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
  2. 下面讲解如何安装Gitosis,这里就不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
  3. 我将Gitosis安装在服务器的 /opt目录下了。Linux:opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。当然也可以根据自己习惯,决定安装到那个目录。
git clone https://github.com/res0nat0r/gitosis.git

执行:git clone https://github.com/res0nat0r/gitosis.git 命令遇到的错误

  • 错误提示:fatal: unable to access 'https://github.com/res0nat0r/gitosis.git/': Encountered end of file 的错误,下面说一下解决方法。

第一种方法:依次执行下面的命令

  • git config --global --unset http.proxy
  • git config --global --unset https.proxy

第二种方法:尝试将目标地址中的 https 改为 git

如果以上两种方式还是不行,那就还使用原命令多尝试克隆几次。我都尝试了好几次,才clone下来

  •  安装Gitosis依赖的工具

yum install python-setuptools -y
  • 进入到Gitosis目录执行:

sudo python setup.py install
  • 出现下面的信息表示安装成功

禁止服务器某个用户通过ssh登录服务器

vim /etc/passwd

找到:这里写需要禁止的用户名:x:1001:1001::/home/git:/bin/bash

修改为:这里写需要禁止的用户名:x:1001:1001::/home/git:/bin/git-shell

git init 和 git init --bare的区别

 大家都知道,初始化仓库的命令是:git init,但是这里初始化仓库的命令是 git init --bare。这两者的区别

        git init 创建的工作仓库(working repository)适合于实际编辑生产过程中,在工作目录下,你将可以进行实际的编码、文件管理操作和保存项目在本地工作。如果你开始创建一个项目将包含有源代码和版本跟踪记录的时候你可以使用”git init”,如果你克隆”git clone”一个已经存在的版本库的时候,你也可以得到一个working repository,它也将包含”.git”目录和源文件的拷贝。(也就是说,在远程仓库上,代码是否需要编辑和执行,如果需要执行,就使用git init)

        git init --bare创建的裸仓库(bare repository)主要是用作分享版本库。开发者使用bare repository可以向其他人分享存储在本地的版本库,以便于实时分享代码更新和团队协作 。通过使用”git push”命令,你可以将你的本地更新提交至“中心版本库”(其他开发者可访问的中心库)。其他开发者可以使用“git pull”命令接受你提交的版本更新。如果你正在一个多人协作的项目团队或者同一个项目需要在不同电脑上面完成的时候,bare repository可以满足你的分布式开发需求。(也就是说,大家都把内容分享到中心仓库,然后每个人都可以获取其他人的修改信息的过程,但中心仓库没有代码文件)

  • git init --bare 的特点

  • 使用命令"git init --bare"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repository),会生成多个记录版本信息的文件。
  • 这种方式,不会包含实际项目源文件的拷贝,所以该版本库不能称为工作目录(working tree)

查看一下刚才用 git init --bare生成的 test.git目录,结构如下

  • git init 的特点

  • 会生成一个.git(隐藏文件夹),在这个文件夹里面有多个版本历史记录文件。
  • 使用–bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件。这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面

查看一下用 git init test_git.git生成的 test_git.git目录,结构如下  

 

  • git init容易产生冲突的地方

  • 因为远端仓库的用户正在master的分支上操作,而你又要把更新提交到这个master分支上,当然就出错了。
  • 但如果是往远端仓库中空闲的分支上提交还是可以的,比如git push origin master:b1 还是可以成功的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下搭建Git服务器 的相关文章

  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 自动将所有 GitHub 存储库镜像到 gitlab

    对于 GitLab 必须手动为每个存储库设置拉 推镜像 我想知道那里有any way可以自动将所有 Github 存储库同步到 GitLab 这样 当您在 GitHub 中创建新的存储库时 GitLab 中的存储库将自动创建 并充当拉取镜像
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • git 匹配多个单词的标签

    我们可以得到最后一个 git 标签 它以一个单词 例如 TEST 开头 如下所示 git describe tag dirty match TEST 我想知道如何获得最后一个以 word1 开头的标签orword2 例如测试OR跑步 我尝试
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • git 日志历史记录图,每次提交一行,彩色,带有日期

    我需要的格式如下 git log decorate graph oneline date order 但我也需要它 包含日期 短 具有相同的颜色 I tried git log decorate graph oneline date ord
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • CString 的成员函数详解

    CString 的成员函数详解 CSTRING的成员函数详解 typedef ATL CStringT lt TCHAR StrTraitMFC DLL lt TCHAR gt gt CString CString的构造函数 xff1a 1
  • Rust: Rust 异步入门 (作者洋芋,来自Rust语言中文社区)

    Rust每周一知 Rust 异步入门 原创 洋芋 Rust语言中文社区 前天 这是一篇博文翻译 xff0c 略有删减 xff0c 整理代码方便统一阅读 xff0c Github链接 xff1a https github com lester
  • (转)Julia PkgServer 镜像服务

    https mp weixin qq com s DyegFcNEjieJspc 3B5G6w Julia PkgServer 镜像服务 原创 Johnny Chen JuliaCN 昨天 长久以来 xff0c 受国内网络环境影响 xff0
  • python : pandas库的后继者polars库

    polars库是python的又一dataframe库 xff0c 显然 xff0c 在pandas库的光芒下 xff0c 要上位是不容易的 xff0c 必须有过硬的功夫 一 用法基本一致 从长相上看 xff0c 两者有孪生相 xff0c
  • 证券类私募主要需求及核心服务商

  • Python:同花顺全数据接口

    前往 xff1a http quantapi 10jqka com cn page 61 home 如果是windows 根据不同用户 xff0c 可以选择不同的下载 1 iFinDPy 模块 下载完成后 xff0c 会出现一个DataIn
  • 使用Python中PIL图形库进行截屏

    目的 xff1a 通过使用Python的一个图形库PIL xff08 Python Image Library xff09 对屏幕进行截图 步骤 xff1a 1 下载PIL xff08 路径 xff09 并安装 2 新建文件 截屏 py x
  • 详解Python中pyautogui库的最全使用方法

    详解Python中pyautogui库的最全使用方法 在使用Python做脚本的话 xff0c 有两个库可以使用 xff0c 一个为PyUserInput库 xff0c 另一个为pyautogui库 就本人而言 xff0c 我更喜欢使用py
  • python : pandas 中多重索引multiindex与多个标的dataframe

    多个标的dataframe 如何转成多重索引的dataframe 有点象 xff0c 有中证500股票的数据 xff0c 如何把这500只股票 xff0c 整成一个多重索引的dataframe span class token functi
  • 关于Rust中的自引用:差之毫厘?!

    先设计一个自引用类型 xff0c 然后能过std mem swap来观察其变化 xff1a 一 为什么自引用没有出现预期的问题 use std mem derive Debug struct SelfRef name String ptr
  • Rust std::mem::transmute实例讲解

    Rust std mem transmute实例讲解 时间 2022 04 08 本文章向大家介绍Rust std mem transmute实例讲解 xff0c 主要分析其语法 参数 返回值和注意事项 xff0c 并结合实例形式分析了其使
  • Julia : 如何一行实现99乘法表?

    我个人的方法如下 xff0c 还有什么更简洁的么 xff1f 一 V1 0 span class hljs built in map span y span class hljs subst gt span println reduce s
  • 整理了一份史上最全的DevOps 工具链

    2018 02 07 朱少民 软件质量报道 在列出DevOps 工具链之前 xff0c 介绍一下什么是DevOps xff0c 虽然DevOps这个概念现在还没有标准的定义 xff0c 但我们可以追溯一下其过去九年的历史发展过程 xff08
  • https://zhuanlan.zhihu.com/p/36070173

    https zhuanlan zhihu com p 36070173
  • 几款SSH客户端

    SecureCRT Xshell Putty等都仅仅是客户端软件 xff0c 一般用于Windows客户端计算机 xff0c 因此 xff0c 无论选择哪款客户端SSH工具都是可以的 1 SecureCRT 8 1版本 SecureCRT是
  • Rust: 如何与DLL文件进行交互?

    Rust除了有FFI方式与外部或其它语言交互外 xff0c 还可以通过DLL的方式进行交互 更一步了解 xff0c 可以参考 xff1a https www insp top article how to implement dynamic
  • 八问数据中台:关于数据中台你想知道的都在这里!

    八问数据中台 xff1a 关于数据中台你想知道的都在这里 xff01 原创 xff1a 筱愚她爸 凯哥讲故事系列 1周前 数据中台最近特别火 xff0c 各个企业都在关注如何构建自己的数据中台 xff0c 利用数据中台打造数据驱动的经营能力
  • 小白学python系列————【Day45】面向对象魔法方法及元类详细

    今日内容概要 反射实战案例面向对象的魔法方法 双下方法 魔法方法实战演练元类简介创建类的两种方式元类的实际应用元类之双下new方法 反射实战案例 1 实战一 xff1a 加载配置文件纯大写的配置 span class token comme
  • Python将自己的Py文件(或包)发布至pip上

    Python将自己的Py文件 xff08 或包 xff09 发布至pip上 开始只打包一个py文件第一步在Pypi和Github上拥有自己的账号第二步 有一个python库 pgzero template pyREADME mdLICENS
  • Linux下搭建Git服务器

    目录 步骤一 安装Git xff1a 步骤二 服务器端创建git用户 xff08 管理Git服务 xff09 服务器端的Git配置公钥 生成rsa证书文件 步骤三 服务器端创建Git仓库 步骤四 客户端clone服务器端git仓库 1 在客