一、背景介绍
Gitlab 个人令牌是一种用于访问 Gitlab 仓库的认证方式,相较于密码,令牌更加安全,且不需要每次访问时都输入密码。然而,在生成个人令牌时,有时会遇到失败的情况,本文将详细介绍解决方法。

二、生成个人令牌失败的原因
1. 网络连接问题
2. Gitlab 服务端问题
3. 用户权限不足
三、问题排查
1. 网络连接问题
确保您的网络连接正常,可以尝试重新打开 Gitlab 网页或使用其他网络工具进行测试。
2. Gitlab服务端问题
检查 Gitlab 服务端是否正常运行,可以尝试联系 Gitlab 管理员进行排查。
对于自建服务执行以下命令:
进入容器内部,首先用
docker ps查看 gitlab 的容器 id
docker exec -it <你的GitLab容器ID> bash执行服务状态检查
gitlab-ctl status若
PostgreSQL或Redis显示 “down”,需重启服务:
gitlab-ctl restart postgresql
gitlab-ctl restart redis
gitlab-ctl restart rails3. 用户权限不足
确保您拥有生成个人令牌的权限,可以联系 Gitlab 管理员进行授权。
联系 GitLab 管理员,确认你的账户是否为至少 “Reporter” 角色(通常 “Developer” 及以上角色可创建个人令牌,具体以实例配置为准)。
对于自建服务执行以下命令:
确认 GitLab 配置中未禁用个人访问令牌功能,编辑容器内的/etc/gitlab/gitlab.rb文件:
此命令是刚进入 ssh 客户端的命令:
docker exec -it <你的GitLab容器ID> vi /etc/gitlab/gitlab.rb上面已经进入容器了,可以执行以下命令:
vi /etc/gitlab/gitlab.rb如果在搭建服务过程中容器用了持久化存储:
直接修改文件里面即可:

确保以下配置未被注释且值为
true:
gitlab_rails['personal_access_tokens_enabled'] = true保存后执行配置重载并重启服务:
gitlab-ctl reconfigure
gitlab-ctl restart四、解决办法
1、进入 GitLab 容器的 Rails 控制台
打开终端,执行命令进入 GitLab 容器的 Rails 交互环境:
特别注意,不要在 Redis 数据管理工具界面或者容器内部执行,是打开 ssh 的界面执行,并且没有进入任何容器
docker exec -it <你的GitLab容器ID> gitlab-rails console2、在 Rails 控制台内执行令牌创建代码
在 Rails 控制台中,输入以下 Ruby 代码(替换"wshlyl"为你的 GitLab 管理员用户名):
user = User.find_by(username: "wshlyl")
token = user.personal_access_tokens.create!(
name: "sourcetreeOne",
scopes: [:read_repository, :write_repository],
expires_at: 1.week.from_now
)
puts "生成的令牌:#{token.token}"执行后,控制台会输出类似生成的令牌:glpat-xxxxxxxxxxxxxxxx的字符串,复制该令牌即可用于工具(如 SourceTree)的认证。

3、复制生成的令牌去验证
验证语句,在 ssh 界面替换下面的令牌,后面的域名为自建服务需要更换
curl --header "Private-Token: glpat-sUbUUiiVVPKu5WSlVmtz7286MQp1OjMH." "https://git.wshlyl.cn/api/v4/user"若返回 JSON 格式的用户信息,说明令牌有效,问题可能出在界面缓存或使用场景;
若返回
401 Unauthorized,说明令牌无效,需重新生成。

4、查询令牌信息
个人访问令牌在界面中仅在创建时显示一次,后续无法再查看(出于安全设计)。若需确认存在,可通过 Rails 控制台查询。
5、进入 GitLab 容器的 Rails 控制台
打开终端,执行命令进入 GitLab 容器的 Rails 交互环境:
特别注意,不要在 Redis 数据管理工具界面或者容器内部执行,是打开 ssh 的界面执行,并且没有进入任何容器
docker exec -it <你的GitLab容器ID> gitlab-rails console这个命令执行的前提是要记住生成令牌的名字,
user.personal_access_tokens.where(name: "sourcetreeOne").first
评论