在容器环境下开发,使用git的注意事项

未匹配的标注

跨操作系统编程,也并不是因为有了Docker的加持之后,就变得一劳永逸。还是有很多需要注意的地方。比如使用git的时候,就有几个需要关注的地方。今天就来聊一聊在 docker 容器环境下开发的话,使用 git 需要注意什么。

换行符

如果你既在Windows本地基于一个库做开发,又在容器环境中对同一个库做开发的话,就需要考虑换行符的问题了。Windows上的换行符是 CRLF(Carriage Return and Line Feed),在代码层面用 \r\n 表示;在 Linux 上的换行符是 LF(Line Feed),在代码层面用 \n 表示。我们开发者在查看代码的时候,看起来就是一个换行,并不能看出什么差异。但是对于 git 来说,这2者是不同的。

那么这会导致什么问题呢?假设你在Windows上写了几百行代码并把代码push到git库中,之后又有同事在 Linux 容器中,把你的代码拉了下来,完成了自己的工作之后,就提交到 git 了。这个时候如果去查看 git 的修改记录的话,会看到几百个换行符的修改记录。而你真正关心的修改记录就存在于这几百个修改记录之中。慢慢找吧,记得多点一杯咖啡……

解决方案:你可以选择在 Windows 上全局禁用行尾转换,或者使用 .gitattributes 文件来禁用行尾转换。通常,在仓库中加上或者修改 .gitattributes 文件是解决这个问题的最保险的方式,不用担心团队成员中,有谁机器配置和其他人不一样。

比如,可以把以下内容添加到 .gitattributes 文件中,把 .gitattributes 文件放在库的根目录中,强制所有内容的换行符都更换成 LF ,除了 Windows 批处理文件,因为这些文件是需要 CRLF 的:

  • text=auto eol=lf

*.{cmd,[cC][mM][dD]} text eol=crlf

*.{bat,[bB][aA][tT]} text eol=crlf

这个方法需要 Git v2.10 及以上版本才会生效,所以记得确保自己的 git 版本足够新。同时,也可以添加库中其它需要CRLF的文件类型到这个文件中。

诶?既然说 .gitattributes 是最可靠的解决方案,那么一起学Docker12:如何在容器中实现远程开发一文种, VS Code 的官方范例镜像中,是不是也用到了 .gitattributes 镜像了呢?

果然,一样的文件,一样的配方。不得不说范例镜像为我们起到了很好的示范作用。

如果你仍旧希望总是上传 Unix样式的行尾 —— LF 的话,可以使用 input 选项。

git config –global core.autocrlf input

如果你更偏向于完全禁用行尾转换的话,可以运行以下命令:

git config –global core.autocrlf false

共享凭据

如果你使用 Git凭据管理器 来克隆库的话,你的容器应该已经能够访问你的凭据了。如果你使用 SSH 密钥的话,你也可以选择共享密钥。

如果本地没有设置 git 的用户名 或 邮箱地址的话,需要运行以下命令设置一下:

git config –global user.name “你的名字”

git config –global user.email “你的邮箱地址”

之后在容器启动的时候,插件会自动把你本地的 .gitconfig 文件拷贝到容器中,这样就不需要在容器中做这个操作了。

使用凭据小帮手

如果你是使用 HTTPS 进行仓库克隆,并在本地操作系统中配置了凭据小帮手的话,就不需要额外配置了。本地输入的凭据会在容器中复用,反之亦然。

使用 SSH 密钥

有时候可以使用 SSH 密钥而不是凭据小帮手来克隆仓库。这种情况下,如果本地有 SSH agent 在运行的话,插件会帮忙做自动转发。

如果看过我如何不用指定密钥文件就使用SSH登录?的视频的话,就已经知道,Windows10 本身自带了 OpenSSH,只要启动了 ssh-agent ,就能够通过 ssh-add 命令将 SSH 密钥加入 ssh-agent ,从而实现加密的 SSH 通讯。

GitHub 支持各种使用 SSH 密钥的方式。既可以上传现有的密钥对,也可以创建新的密钥对。密钥对分为公钥和私钥,我们需要把公钥上传到 GitHub 。既可以通过GitHub网站复制公钥的内容进行上传,也可以通过 GitHub CLI 工具进行上传。具体方法可以参考 GitHub 的文档,如果遇到问题,也欢迎评论区留言或私信给我。公钥知道怎么处理了,那么私钥呢?通过 ssh-add 命令添加到 ssh-agent 即可。假设在你的用户目录下,存放着一个私钥叫 github_rsa ,而其对应的公钥已经上传到 GitHub 了。那么我们只需要运行:

ssh-add $HOME/.ssh/github_rsa

就可以把私钥添加进 ssh-agent ,只要 ssh-agent 在后台运行,我们就可以实现通过 ssh 方式克隆仓库了。

上述命令的 $HOME 指的是你在 Windows 上的用户目录,比如我当前用户是 Administrator ,那么我的用户目录就是:

如果你运行上述命令报错,很可能是你的 ssh-agent 没有在后台运行。解决方案和原理都在上述视频中提到了,我们再来复习一下,记得以下命令都要以管理员权限运行:

1、设置 ssh-agent 的启动类型为 Automatic,这样电脑开机之后,ssh-agent 会自动在后台运行。

Set-Service ssh-agent -StartupType Automatic

2、虽然启动类型设为自动了,但是我现在就想使用 ssh-agent ,不想重启电脑,那么我们就手动启动它:

Start-Service ssh-agent

3、其实上述命令执行后,没什么报错的话,就可以添加密钥了。保险起见,可以看一下 ssh-agent 的状态先:

Get-Service ssh-agent

看到状态是 Running 就表示 ssh-agent 已经在运行了。现在再运行一遍上述 ssh-add 的相关命令,把私钥加入 ssh-agent ,就可以和 docker 容器共享 SSH 密钥啦。

以上就是 Windows 和 Linux 容器 作为混合开发环境的情况下,使用 git 时,所需要注意的事项了。

当然,如果你的宿主机是 Linux 的,或者操作中用到了 GPG 密钥的话,仍有其它注意事项。欢迎跟我评论区或私信讨论你的使用场景和遇到的问题。如果可以点赞、关注就更好了。

我们下一期,不见不散。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
秦晓武
讨论数量: 0
发起讨论 只看当前版本


暂无话题~