GitLab 的最新版 6.6 采用了 Bootstrap 3 的响应式 UI,加入了两栏对比 diff 等新功能,还有众多细节改进。
小插曲:升级过程中,在升级数据库时,出现如下错误提示:
Mysql2::Error: Incorrect string value: '\xE6\x96\x87\xE4\xBB\xB6...' for column 'st_diffs' at row 1: INSERT INTO merge_request_diffs ( merge_request_id, st_commits, st_diffs ) SELECT id, st_commits, st_diffs FROM merge_requests/home/git/gitlab/vendor/bundle/ruby/1.9.1/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:287:in `query'
原因是 MySQL 的 merge_request_diffs 表使用了 latin1 字符集建立,不能容纳 UTF-8 字符。
解决方法:在 MySQL 终端中进入 gitlab 数据库,执行如下两条命令:
mysql> alter table merge_request_diffs default character set = utf8 collate = utf8_unicode_ci; mysql> alter table merge_request_diffs convert to character set utf8 collate utf8_unicode_ci;
然后再执行
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
就能成功了。
有同样编码问题的表还有
broadcast_messages deploy_keys_projects emails forked_project_links merge_request_diffs users_groups
虽然 LUG 的 GitLab 实例在其他表里没有 UTF-8 字符,但保险起见,都把默认字符集改成了 UTF-8,并把表中已有的数据转换到 UTF-8 字符集。
不建议绕过ROR的model,直接使用SQL直接修改数据库。这么做会导致migrate跟踪错误。rake migrate无法完全回滚数据库结构。
比较好的方案是:添加一个magration,用于修改某个表的char set,增加option参数即可
:options => ‘COLLATE=utf8_general_ci’
为什么要“回滚”数据库结构?不是只要升级吗?