如何在 Redmine 中获得修订和 git 问题链接?

How can I get revisions and git issue linking working in Redmine?

我已经阅读了很多有关如何将 Git 集成到 Redmine 的内容。我试过 git-hook 插件,但它仍然没有显示与提交相关的修订或问题。这是我现在拥有的:

这两个 cron 作业每 5 分钟一次 运行:

*/5 * * * * deploy cd /home/deploy/github_repo/ && ./git_checker.sh
*/5 * * * * deploy cd /home/deploy/apps-available/redmine/ && ./bin/rails runner "Repository.fetch_changesets" -e production

第一个 cron 作业中的 git_checker.sh 文件如下所示:

#! /bin/bash
now="$(date +'%d/%m/%Y %T')"
echo "-------------------------------"
for d in */ ; do
        now="$(date +'%d/%m/%Y %T')"
        cd $d && git fetch origin +refs/heads/*:refs/heads/* && git reset --soft
        cd ..
        echo "Excuted in $d at $now"
echo "-------------------------------"
done >> output_file

输出文件只是检查它是否 运行,确实如此:

Excuted in project1.git/ at 21/07/2020 06:05:01
-------------------------------
Excuted in project2/ at 21/07/2020 06:05:02
-------------------------------
Excuted in project3-backend/ at 21/07/2020 06:05:03
-------------------------------
Excuted in project3-frontend.git/ at 21/07/2020 06:05:03
-------------------------------
Excuted in project4/ at 21/07/2020 06:05:04
-------------------------------

存储库设置如下:[![存储库设置][1]][1]

这是我的项目存储库设置的示例:[![项目设置][2]][2]

这是我所做的 git 提交的示例。请注意,我在提交消息中包含了 IssueID:

commit ad3cb36ad5478a55a455dfb0d17c127asdf34 (HEAD -> master, origin/master, origin/HEAD)
Author: Jason Shultz <user@gmail.com>
Date:   Mon Jul 20 22:58:30 2020 -0600

    IssueID 1996 testing repository linking

在这里您可以看到项目的存储库。你会看到没有修改。 [![项目库][3]][3]

在这里你会看到我更改的文件。它显示修订号,但如果我单击它们,我会得到 404。[![已更改的文件][4]][4]

单击已更改的文件时,“历史记录”选项卡为空。

--- ENVIRONMENT ---

sh: 1: svn: not found
sh: 1: hg: not found
sh: 1: cvs: not found
sh: 1: bzr: not found
Environment:
  Redmine version                4.1.0.devel
  Ruby version                   2.6.5-p114 (2019-10-01) [x86_64-linux]
  Rails version                  5.2.4.2
  Environment                    production
  Database adapter               Mysql2
  Mailer queue                   ActiveJob::QueueAdapters::AsyncAdapter
  Mailer delivery                smtp
SCM:
  Git                            2.17.1
  Filesystem
Redmine plugins:
  additionals                    2.0.23
  redmine_agile                  1.5.3
  redmine_checklists             3.1.16
  redmine_contacts               4.3.0
  redmine_edit_custom_fields     0.0.5
  redmine_github_hook            3.0.1
  redmine_pretend                2.0.1
  redmine_user_import            0.1.0

编辑 2020 年 7 月 21 日 7:49pm

根据@jkraemer 的问题。我做了一个简单的更改,并在我的提交消息中输入: git commit -m 'IssueID #1996: test test'

我跟踪日志文件 运行 ./bin/rails runner "Repository.fetch_changesets" -e production.

日志文件输出:

Creating scope :system. Overwriting existing method Enumeration.system.
Creating scope :sorted. Overwriting existing method Group.sorted.
Creating scope :sorted. Overwriting existing method User.sorted.
Starting Pretend plugin for RedMine
Creating scope :visible. Overwriting existing method Principal.visible.
Creating scope :visible. Overwriting existing method AgileQuery.visible.
Creating scope :visible. Overwriting existing method PeopleQuery.visible.

此外,我注意到 Redmine 中的存储库没有显示任何更新。它仍然显示之前的文件版本。 (我还仔细检查以确保我确实推送了代码。)

编辑 2020 年 7 月 23 日

我更改了调试级别,再次尝试同步,并获得了更令人印象深刻的注销方式:

Completed 200 OK in 2234ms (Views: 1673.8ms | ActiveRecord: 448.1ms)
   (0.6ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
Creating scope :system. Overwriting existing method Enumeration.system.
Creating scope :sorted. Overwriting existing method Group.sorted.
Creating scope :sorted. Overwriting existing method User.sorted.
  AnonymousUser Load (0.7ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('AnonymousUser') AND `users`.`lastname` = 'Anonymous' LIMIT 1
Starting Pretend plugin for RedMine
  Setting Load (0.7ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'plugin_additionals' ORDER BY `settings`.`id` DESC LIMIT 1
Creating scope :visible. Overwriting existing method Principal.visible.
Creating scope :visible. Overwriting existing method AgileQuery.visible.
Creating scope :visible. Overwriting existing method PeopleQuery.visible.
Started GET "/github_hook?project_id=intertracker-frontend" for 140.82.115.147 at 2020-07-23 21:54:39 +0000
Processing by GithubHookController#welcome as */*
  Parameters: {"project_id"=>"intertracker-frontend"}
   (0.7ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
   (0.6ms)  SELECT MAX(`settings`.`updated_on`) FROM `settings`
  Setting Load (0.6ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'rest_api_enabled' ORDER BY `settings`.`id` DESC LIMIT 1
  AnonymousUser Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('AnonymousUser') AND `users`.`lastname` = 'Anonymous' LIMIT 1
  Current user: anonymous
  Setting Load (0.5ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'force_default_language_for_anonymous' ORDER BY `settings`.`id` DESC LIMIT 1
  Setting Load (0.5ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'default_language' ORDER BY `settings`.`id` DESC LIMIT 1
  Rendering plugins/redmine_github_hook/app/views/github_hook/welcome.html.erb within layouts/base
  Rendered plugins/redmine_github_hook/app/views/github_hook/welcome.html.erb within layouts/base (0.7ms)
  Setting Load (0.8ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'app_title' ORDER BY `settings`.`id` DESC LIMIT 1
  Setting Load (0.6ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'ui_theme' ORDER BY `settings`.`id` DESC LIMIT 1
  Setting Load (0.8ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'default_users_hide_mail' ORDER BY `settings`.`id` DESC LIMIT 1
  Setting Load (0.6ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'default_users_time_zone' ORDER BY `settings`.`id` DESC LIMIT 1
  Rendered plugins/redmine_pretend/app/views/user/_unpretend.html.erb (0.5ms)
  Rendered plugins/additionals/app/views/additionals/_html_head.html.slim (10.2ms)
  Setting Load (0.7ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'gravatar_enabled' ORDER BY `settings`.`id` DESC LIMIT 1
  Rendered plugins/additionals/app/views/additionals/_body_top.slim (2.2ms)
  Setting Load (0.7ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'login_required' ORDER BY `settings`.`id` DESC LIMIT 1
  Setting Load (0.6ms)  SELECT  `settings`.* FROM `settings` WHERE `settings`.`name` = 'self_registration' ORDER BY `settings`.`id` DESC LIMIT 1
  Role Load (0.8ms)  SELECT DISTINCT `roles`.* FROM `roles` INNER JOIN `member_roles` ON `member_roles`.`role_id` = `roles`.`id` INNER JOIN `members` ON `members`.`id` = `member_roles`.`member_id` INNER JOIN `projects` ON `projects`.`id` = `members`.`project_id` WHERE (projects.status <> 9) AND `members`.`user_id` = 4
  Role Load (0.5ms)  SELECT  `roles`.* FROM `roles` WHERE `roles`.`builtin` = 2 LIMIT 1
  GroupAnonymous Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
   (0.8ms)  SELECT `users`.`id` FROM `users` WHERE `users`.`type` IN ('GroupAnonymous')
   (0.7ms)  SELECT `members`.`user_id`, `role_id`, `members`.`project_id` FROM `members` INNER JOIN `projects` ON `projects`.`id` = `members`.`project_id` INNER JOIN `member_roles` ON `member_roles`.`member_id` = `members`.`id` WHERE (projects.status <> 9) AND (members.user_id = 4 OR (projects.is_public = TRUE AND members.user_id = 2))
  EnabledModule Exists (0.6ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'issue_tracking' LIMIT 1
  GroupAnonymous Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
  EnabledModule Exists (0.6ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'gantt' LIMIT 1
  GroupAnonymous Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
  EnabledModule Exists (0.6ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'calendar' LIMIT 1
  GroupAnonymous Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
  EnabledModule Exists (0.6ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'news' LIMIT 1
  Rendered plugins/additionals/app/views/additionals/_content.html.slim (2.5ms)
  Rendered plugins/additionals/app/views/additionals/_body_bottom.html.slim (2.7ms)
  Rendered plugins/redmine_people/app/views/common/_people_select2_data.html.erb (0.7ms)
  Rendered plugins/redmine_people/app/views/common/_layout_bottom.html.erb (6.8ms)
Completed 200 OK in 1048ms (Views: 170.6ms | ActiveRecord: 23.8ms)

编辑 2020 年 7 月 24 日

这是 irb 输出:

irb(main):031:0> Repository.find(45).fetch_changesets
  Repository Load (0.7ms)  SELECT  `repositories`.* FROM `repositories` WHERE `repositories`.`id` = 45 LIMIT 1
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'branch' '--no-color' '--verbose' '--no-abbrev'
  Changeset Exists (0.6ms)  SELECT  1 AS one FROM `changesets` WHERE `changesets`.`repository_id` = 45 LIMIT 1
   (0.4ms)  BEGIN
  Repository Exists (0.5ms)  SELECT  1 AS one FROM `repositories` WHERE `repositories`.`identifier` = BINARY 'intertracker-frontend' AND `repositories`.`id` != 45 AND `repositories`.`project_id` = 117 LIMIT 1
   (0.4ms)  COMMIT
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'log' '--no-color' '--encoding=UTF-8' '--raw' '--date=iso' '--pretty=fuller' '--parents' '--stdin' '--no-renames' '--reverse'
=> nil

这是相应的尾日志:

Repository Load (0.7ms)  SELECT  `repositories`.* FROM `repositories` WHERE `repositories`.`id` = 45 LIMIT 1
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'branch' '--no-color' '--verbose' '--no-abbrev'
  Changeset Exists (0.6ms)  SELECT  1 AS one FROM `changesets` WHERE `changesets`.`repository_id` = 45 LIMIT 1
   (0.4ms)  BEGIN
  Repository Exists (0.5ms)  SELECT  1 AS one FROM `repositories` WHERE `repositories`.`identifier` = BINARY 'intertracker-frontend' AND `repositories`.`id` != 45 AND `repositories`.`project_id` = 117 LIMIT 1
   (0.4ms)  COMMIT
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'log' '--no-color' '--encoding=UTF-8' '--raw' '--date=iso' '--pretty=fuller' '--parents' '--stdin' '--no-renames' '--reverse'

它实际上并没有从 github 存储库中获取更改。如果我手动 运行:

git fetch origin +refs/heads/*:refs/heads/* && git reset --soft

然后它确实拉取代码,然后 运行 上面的命令再次获取变更集:

Repository Load (0.8ms)  SELECT  `repositories`.* FROM `repositories` WHERE `repositories`.`id` = 45 LIMIT 1
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'branch' '--no-color' '--verbose' '--no-abbrev'
  Changeset Exists (0.6ms)  SELECT  1 AS one FROM `changesets` WHERE `changesets`.`repository_id` = 45 LIMIT 1
   (0.4ms)  BEGIN
  Repository Exists (0.5ms)  SELECT  1 AS one FROM `repositories` WHERE `repositories`.`identifier` = BINARY 'intertracker-frontend' AND `repositories`.`id` != 45 AND `repositories`.`project_id` = 117 LIMIT 1
   (0.4ms)  COMMIT
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'log' '--no-color' '--encoding=UTF-8' '--raw' '--date=iso' '--pretty=fuller' '--parents' '--stdin' '--no-renames' '--reverse'
=> nil
irb(main):085:0> Repository.find(45).fetch_changesets
  Repository Load (0.9ms)  SELECT  `repositories`.* FROM `repositories` WHERE `repositories`.`id` = 45 LIMIT 1
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'branch' '--no-color' '--verbose' '--no-abbrev'
  Changeset Exists (0.6ms)  SELECT  1 AS one FROM `changesets` WHERE `changesets`.`repository_id` = 45 LIMIT 1
   (0.5ms)  BEGIN
  Repository Exists (0.5ms)  SELECT  1 AS one FROM `repositories` WHERE `repositories`.`identifier` = BINARY 'intertracker-frontend' AND `repositories`.`id` != 45 AND `repositories`.`project_id` = 117 LIMIT 1
   (0.4ms)  COMMIT
Shelling out: 'git' '--git-dir' '/home/deploy/github_repo/intertracker-frontend.git' '-c' 'core.quotepath=false' '-c' 'log.decorate=no' 'log' '--no-color' '--encoding=UTF-8' '--raw' '--date=iso' '--pretty=fuller' '--parents' '--stdin' '--no-renames' '--reverse'
=> nil

我安装了 github-hook 插件。它是使用 post 提交挂钩来拉取代码等的那个。如果我将代码推送到 repo,我确实看到挂钩触发器并发生以下输出:

Started GET "/github_hook?project_id=intertracker-frontend" for 140.82.115.155 at 2020-07-24 21:35:12 +0000
Processing by GithubHookController#welcome as */*
  Parameters: {"project_id"=>"intertracker-frontend"}
   (0.6ms)  SELECT MAX(`settings`.`updated_on`) FROM `settings`
  AnonymousUser Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('AnonymousUser') AND `users`.`lastname` = 'Anonymous' LIMIT 1
  Current user: anonymous
  Rendering plugins/redmine_github_hook/app/views/github_hook/welcome.html.erb within layouts/base
  Rendered plugins/redmine_github_hook/app/views/github_hook/welcome.html.erb within layouts/base (0.2ms)
  Rendered plugins/redmine_pretend/app/views/user/_unpretend.html.erb (0.1ms)
  Rendered plugins/additionals/app/views/additionals/_html_head.html.slim (0.6ms)
  Rendered plugins/additionals/app/views/additionals/_body_top.slim (0.1ms)
  Role Load (1.0ms)  SELECT DISTINCT `roles`.* FROM `roles` INNER JOIN `member_roles` ON `member_roles`.`role_id` = `roles`.`id` INNER JOIN `members` ON `members`.`id` = `member_roles`.`member_id` INNER JOIN `projects` ON `projects`.`id` = `members`.`project_id` WHERE (projects.status <> 9) AND `members`.`user_id` = 4
  Role Load (0.5ms)  SELECT  `roles`.* FROM `roles` WHERE `roles`.`builtin` = 2 LIMIT 1
  GroupAnonymous Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
   (0.9ms)  SELECT `users`.`id` FROM `users` WHERE `users`.`type` IN ('GroupAnonymous')
   (0.5ms)  SELECT `members`.`user_id`, `role_id`, `members`.`project_id` FROM `members` INNER JOIN `projects` ON `projects`.`id` = `members`.`project_id` INNER JOIN `member_roles` ON `member_roles`.`member_id` = `members`.`id` WHERE (projects.status <> 9) AND (members.user_id = 4 OR (projects.is_public = TRUE AND members.user_id = 2))
  EnabledModule Exists (0.6ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'issue_tracking' LIMIT 1
  CACHE GroupAnonymous Load (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
  EnabledModule Exists (0.5ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'gantt' LIMIT 1
  CACHE GroupAnonymous Load (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
  EnabledModule Exists (0.5ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'calendar' LIMIT 1
  CACHE GroupAnonymous Load (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`type` IN ('GroupAnonymous') ORDER BY id LIMIT 1
  EnabledModule Exists (0.6ms)  SELECT  1 AS one FROM `enabled_modules` WHERE `enabled_modules`.`project_id` IN (SELECT `projects`.`id` FROM `projects` WHERE (((projects.status <> 9) AND ((projects.is_public = TRUE AND projects.id NOT IN (SELECT project_id FROM members WHERE user_id IN (4,2))))))) AND `enabled_modules`.`name` = 'news' LIMIT 1
  Rendered plugins/additionals/app/views/additionals/_content.html.slim (0.2ms)
  Rendered plugins/additionals/app/views/additionals/_body_bottom.html.slim (0.1ms)
  Rendered plugins/redmine_people/app/views/common/_people_select2_data.html.erb (0.3ms)
  Rendered plugins/redmine_people/app/views/common/_layout_bottom.html.erb (0.5ms)
Completed 200 OK in 23ms (Views: 13.3ms | ActiveRecord: 7.0ms)

但是如果我去项目中的回购,它没有更新。 :( [1]: https://i.stack.imgur.com/y87jo.png [2]: https://i.stack.imgur.com/CWaIv.png [3]: https://i.stack.imgur.com/1uqnM.png [4]: https://i.stack.imgur.com/SO2m7.png

编辑 08/02/2020

正在寻找 NGINX:

~$ ps aux | grep nginx
root      1115  0.0  0.4 230692 19236 ?        Ss   Jul01   0:04 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 17569  0.0  0.4 232988 18636 ?        S    Aug02   0:00 nginx: worker process
www-data 17570  0.0  0.4 232988 18360 ?        S    Aug02   0:00 nginx: worker process
deploy   31000  0.0  0.0  14852  1116 pts/1    S+   04:03   0:00 grep --color=auto nginx

正在寻找 Ruby:

~$ ps aux | grep ruby
deploy   30982  0.0  0.0  14852  1096 pts/1    S+   04:03   0:00 grep --color=auto ruby
as root: # ps aux|grep ruby
root     31890  0.0  0.0  14852  1012 pts/1    S+   04:24   0:00 grep --color=auto ruby

由于评论的长度和格式限制,现在将此作为答案...

权限

常见问题,但如果回购协议不可读等情况,我本以为会在某处出现错误消息。无论如何,检查你的 nginx 配置,你的 Redmine 被配置为 运行 的用户。您应该为您的 cronjobs 使用相同的用户(因此将 deploy 更改为 nginx 或任何您的实际用户)。您手动尝试的任何操作也应以该用户身份完成。整个存储库也应归该用户所有。

这是最简单的设置,当然您可以对不同的用户和组等有所了解,但是一旦您开始使用简单的案例,请先保存它。

使用裸存储库

Redmine docs on the topic 很清楚您必须使用 bare 存储库。您的回购协议似乎并非如此。我不确定,但这可能会有所作为。

插件等

要减少未知数,请在本地计算机上使用普通 Redmine 尝试以上所有操作,然后从那里继续。有时插件会改变工作方式,有时插件会引入错误。从本地裸 git 存储库导入更改集是一项核心功能,不需要任何额外的插件。一旦你开始工作,你就可以开始左右添加东西,钩子、插件、cron 作业,以自动化创建裸存储库、保持更新、导入更改集的过程。但所有这些都必须等到您完成基本的手动步骤后才能完成。