连接redmine和远程gitolite

Connect redmine and remote gitolite

有很多类似的主题(其中很多很老)但我还是迷路了。 我有两台服务器,一台有 gitolite 设置,另一台有 redmine 设置。 用户正在将更改推送到 gitolite 服务器上创建的存储库。 Redmine 是此 gitolite 服务器上的用户,正在从中拉取更改 并在浏览器中显示它们。

更准确地说,我在 redmine 服务器上使用了以下行:

git clone --mirror ssh://gitolite3@gitoliteserver/testing

然后,我将此存储库 (testing.git) 配置为已知存储库 到 redmine - redmine 只能使用裸机和本地存储库。

当用户推送更改到gitolite服务器时,redmine不会自动 让他们看。我必须在 redmine 服务器上执行以下操作:

cd testing.git
git remote update

我可以在 redmine 服务器上使用 cron 来定期更新存储库 testing.git。 但是许多人说这是低效的并提出了钩子。然而,信息是 非常混乱。你能帮我回答 cron 是否是一个可行的解决方案吗? "git remote update" 是这个 cron 的正确命令吗?或者给我 一个干净的例子,如何使用钩子来解决我的问题。

与问题没有直接关系,但我不得不说。 对我来说,非母语英语,像 mirror、mirrored、mirroring 等词是 很难理解,请使用 alice 和 bob 等更简单的术语。 即使远程这个词也很混乱,如果我在 A 上,那么 B 对我来说就是远程的, 但如果我在 B 上,那么 A 对我来说很遥远。因此,很难阅读 关于网上 git ,事情进一步复杂化 事实上,一些解决方案只是 github 或 bitbucket 的变体。

我会选择的第一种方式是通过专用插件使用 Redmine + Gitolite 集成,如下所述:

http://redmine-git-hosting.io/

第二种方式,是你尝试过的,所以:

通过 cron 作业或某种其他类型的计划任务拉取更改是 legit 要做的事情,但是在提交和 cron 作业之间存在一些延迟,并且还不必要地利用网络和资源等资源cpu 用于测试存储库,即使没有更改...

为了正确利用给定的资源,推荐的方法是挂钩,在 Redmine 和 git 服务器中。

所以在你的 gitolite 上,你需要有 post-receive 挂钩,它将执行:

  1. 更新 Redmine 跟踪的你的 repo(你可以通过多种方式做到这一点,其中一种方式是使用 sshpass 或使用 expect 登录到 Redmine 服务器并执行 git 拉取更改)
  2. 触发 Redmine 的存储库更新挂钩,在此处进行了描述: https://www.redmine.org/projects/redmine/wiki/HowTo_setup_automatic_refresh_of_repositories_in_Redmine_on_commit

例如,git 的 post-接收挂钩看起来像:

#!/bin/bash
/usr/bin/sshpass -pPassword ssh -o StrictHostKeyChecking=no user@server 'cd /home/user/repo/ && git pull origin master'
curl "http://<redmine url>/sys/fetch_changesets?key=<your service key>" 

用于更新存储库的 Redmine web 服务密钥可以在 管理中找到 |设置 |存储库选项卡

以下是我如何应用接受的答案(带钩子的解决方案)的详细信息。 欢迎任何评论。

我有两台电脑,我将它们分别称为gitolite3和redmine。

  1. 在计算机 gitolite3 上,我编辑了 .gitolite.rc 并取消注释以下行:

    # allow repo-specific hooks to be added
    'repo-specific-hooks',
    
  2. 在电脑gitolite3上,我创建了文件local/hooks/repo-specific/deploy-redmine-testing.sh

    #!/bin/bash
    ssh -p 22 redmine@redmine '/home/redmine/gitrepo-update.sh'
    
  3. 在电脑gitolite3上,我编辑了.gitolite/conf/gitolite.conf

    repo testing
        RW+     =   @all
        option hook.post-receive  =  deploy-redmine-testing.sh
    
  4. 在电脑redmine上,我创建了/home/redmine/gitrepo-update.sh

    #!/bin/bash
    if [ -d /home/redmine/gitrepo/testing.git ]; then
      cd /home/redmine/gitrepo/testing.git
      git remote update
    fi
    
  5. 在电脑gitolite3上,如果repository testing不存在那么commit和push后会自动创建

  6. 在redmine电脑上,我创建了仓库testing@gitolite3的裸镜像

    git clone --mirror ssh://gitolite3@gitolite3:22/testing
    
  7. 任何进一步提交到 gitolite3 的存储库测试都将被复制到 redmine 的存储库

  8. 如果 redmine 上的 GUI 没有显示所有内容(例如,它只显示最后一次修订)那么你应该删除 GUI 中的条目并重新创建它。