【為了Git新手】Git環境的建立
因为我真的不擅长git,所以我决定总结一下我常常不明白的环境搭建。
环境
操作系统:Amazon Linux 2
适用于个人私有远程存储库的GitHub帐户。
如果没有进行认证设置,就无法完成这个任务。
如果不事先进行身份验证设置,针对远程存储库的下述git命令将要求用户输入用户名和密码,分别使用https或ssh方法。
虽然可以在其时输入,但如果每次都麻烦,最好事先进行设置。
git [clone|fetch|pull|push] xxx...
通过HTTPS进行通信时的认证
可以从以下途径创建访问令牌。
将信息注册到服务器上可能有多种方法,但将其注册到环境变量中似乎是最简便的方法。
export GIT_USER=<username>
expoft GIT_EMAIL=<mail>
export GIT_TOKEN=<token>
export GIT_REPOSITORY=<organization or workspace>/<repository>
export GIT_BRANCH=<branch name>
git config --local user.name ${GIT_USER}
git config --local user.email ${GIT_EMAIL}
在克隆存储库时,-b是指定特定分支进行克隆的选项。如果省略-b,则克隆的是master分支。
git clone -b ${GIT_BRANCH} https://${GIT_USER}:${GIT_TOKEN}@github.com/${GIT_REPOSITORY} <localbranch name>
只需3个步骤!
但是每次都要输入用户名和令牌真是麻烦。
据说如果缓存认证信息,就可以省去输入的麻烦。
在使用ssh进行通信时的身份验证
创建密钥对
如果不存在,则创建一个。-t是指定加密格式的选项。
ssh-keygen -t rsa
对话式需要3次输入,但全部直接按回车也可以。
1. 文件名 2. 密码 3. 重新输入密码
可以使用-f选项来预先指定文件名。
当使用-C选项并将其设置为””时,可以省略输入用户名和终端名。可以进行改写。这将被视为与密钥无关的注释。
如果指定了文件名,ssh将引用默认名称的私钥导致通信失败。 必须在〜/ .ssh / config中注册密钥名称。
Host github
HostName github.com
IdentityFile ~/.ssh/<秘密鍵の名前>
User git
尽管公式中如下所述,但已经过认证的事项没有问题。
ssh-keygen -t ed25519 -C "your_email@example.com"
在GitHub上注册公共密钥
从以下画面中注册.pub文件的密钥对。
只需提供一种选择的汉语释义:
③连接确认
试着尝试进行通信,下面的情况可以进行通信。
[testuser@testsrv ~]$ ssh -T git@github.com
Hi <account name>! You've successfully authenticated, but GitHub does not provide shell access.
在GitHub仓库页面中选择“Code”,然后选择SSH并复制显示出的路径来克隆仓库。
git clone git@github.com:<organization or workspace>/<repogitory name>.git
虽然这样做应该可以,但官方文档建议使用ssh-agent,如果需要的话,可以考虑使用。
关于ssh-agent的内容,下面的页面非常易懂。其中还介绍了ForwardAgent,对我来说非常有参考价值。
有关git config
在执行git config时,可以在https部分定义用户等内容,并且还可以进行其他各种设置。
如果你在处理本地存储库和远程存储库时不需要特别注意,那么在存储库中的.git/config会自动添加各种设置,而当你尝试在存储库之外的目录中对远程存储库进行操作时,会出现错误,因此最好为使用git的用户进行设置。
如果毫无特别设定地工作,文件会变成这个样子。
[testuser@srv <localrepogitory name>]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:<workspace>/<remoterepogitory name>.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "develop"]
remote = origin
merge = refs/heads/develop
[branch "feature/fix_xxx"]
remote = origin
merge = refs/heads/feature/xxx
[branch "feature/zzz"]
remote = origin
merge = refs/heads/feature/zzz
[user]
email = <mail>
name = <username>
[branch "feature/ccc"]
remote = origin
merge = refs/heads/feature/ccc
[branch "feature/vvv"]
remote = origin
merge = refs/heads/feature/vvv
[testuser@srv <localrepogitory name>]$ git config --list
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@github.com:<workspace>/<remoterepogitory name>.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.develop.remote=origin
branch.develop.merge=refs/heads/develop
branch.feature/xxx.remote=origin
branch.feature/xxx.merge=refs/heads/feature/xxx
branch.feature/zzz.remote=origin
branch.feature/zzz.merge=refs/heads/feature/zzz
user.email=<mail>
user.name=<username>
branch.feature/ccc.remote=origin
branch.feature/ccc.merge=refs/heads/feature/ccc
branch.feature/vvv-conf.remote=origin
branch.feature/vvv.merge=refs/heads/feature/vvv
在进行git config的时候,使用https链接,有一个–local选项,这将变成仓库级别的设置。如果要进行用户级别的设置而不是仓库级别的设置,则需要加上–global选项。
git config --global user.name "<user name>"
git config --global user.mail <email>
用户级别的设置将在下述文件中反映。
[ec2-user@testsrv <カレントディレクトリ>]$cat ~/.gitconfig
[user]
name = <name>
mail = <mail>
除此之外,还有一些设置可以应用于整个系统,比如 system 选项,每个选项的用途可以参考下面的内容。
将提示框自定义
通常的提示信息如下所示,git难以使用。
[ec2-user@testsrv <カレントディレクトリ>]$
让我们使用git-prompt.sh
如果安装了Git,它应该大致位于服务器的某个地方。
经过搜索得出以下结果。
[ec2-user@testsrv ~]$ find / -name git-prompt.sh 2> /dev/null
/usr/share/doc/git-2.23.4/contrib/completion/git-prompt.sh
/usr/share/git-core/contrib/completion/git-prompt.sh
也许是同样的东西,决定使用上述的脚本,并将其注册到~/.bash_profile中。
通过脚本处理好获取到的信息,然后将其注册到环境变量$PS1中,就可以反映到提示符上。
“$PS1的默认值”
[ec2-user@testsrv ~]$ echo $PS1
[\u@\h \W]\$
\u是用户名称,\h是主机名称,\W是当前目录。
\$是除了root用户外,其他用户以$表示,请确保理解这一点。
在使用git时,我想要实现以下目标。
显示当前分支名称
在函数__git_ps1中获取分支名称。%s被包含在[]中是因为想要用[]括起分支名称。
因此为$(__git_ps1 [%s])。
export PS1='\u@\h:\W$(__git_ps1 [%s])\$'
我希望给分支名称添加颜色。
使用\[\033[31m\] \W将当前目录变为红色,同样的方式后面的\[\033[33m\]将其变为黄色。
我以为只需要这样就可以了,但是如果不明确地加入\[\033[00m\]来表示禁用,整个内容都会变成黄色,所以需要添加追加内容。
\033是转义序列,如果没有它,提示符会显示33m之类的东西。
export PS1='\u@\h:\[\033[31m\]\W\[\033[33m\]$(__git_ps1 [%s])\[\033[00m\]$'
展示状态
显示什么根据个人喜好而定,但本次将以下内容注册到~/.bash_profile中
#add/commitされていない変更が存在する場合*を表示
GIT_PS1_SHOWDIRTYSTATE=true
#git管理されていない新規ファイルが存在する場合%表示
GIT_PS1_SHOWUNTRACKEDFILES=true
在ssh和https之间,最终选择哪种通信方式更好?
这里有这样的描述。
通过HTTPS进行连接(推荐)
为什么要推荐还不明确。
这里面也有各种记录。
无论可见性如何,所有存储库都可以使用 https:// 克隆链接。即使您在防火墙或代理后面,https:// 克隆链接也能够正常工作。
即使有代理和防火墙,它也能轻松使用,这是推荐的原因吗?
如果你正在访问使用SAML SSO的组织,那么在进行认证之前,你还必须对个人访问令牌进行授权,以便访问该组织。
如果使用该组织,则必须由管理员创建令牌并使用该令牌进行通信,这样更安全,对吗?就像在SSH中添加公钥一样,必须由管理员执行相同的步骤。
通信的体验速度也一样(使用GitHub Actions之类的会有不同吗?)虽然我并不感到SSH不方便,但我打算根据情况选择使用,直到有一天找到原因为止。