一、背景介绍

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

二、生成个人令牌失败的原因

  • 1. 网络连接问题

  • 2. Gitlab 服务端问题

  • 3. 用户权限不足

三、问题排查

1. 网络连接问题

确保您的网络连接正常,可以尝试重新打开 Gitlab 网页或使用其他网络工具进行测试。

2. Gitlab服务端问题

检查 Gitlab 服务端是否正常运行,可以尝试联系 Gitlab 管理员进行排查。

对于自建服务执行以下命令:

  1. 进入容器内部,首先用docker ps 查看 gitlab 的容器 id

docker exec -it <你的GitLab容器ID> bash
  1. 执行服务状态检查

gitlab-ctl status
  • PostgreSQL Redis 显示 “down”,需重启服务:

gitlab-ctl restart postgresql
gitlab-ctl restart redis
gitlab-ctl restart rails

3. 用户权限不足

确保您拥有生成个人令牌的权限,可以联系 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 console

2、在 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,说明令牌无效,需重新生成。

QQ20251029-112203.png

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