如何让服务器在收到未加密推送后自动推送到加密 Git 存储库

How to make server automatically push to Encrypted Git Repository after recieving Unencrypted push

我们公司有一个基于 Rails.

的软件的 SVN 存储库

我们还有一个手动更新的加密存储库 - 提取未加密,使用 RubyEncoder 编码,推送到加密。

我们大部分时间都已过渡到 Git,并且希望使流程自动化,我希望流程自动化,并且每次提交。

所以

  1. 服务器接收到未加密的任何分支的推送
  2. 服务器过滤器更改了 .rb 文件,通过 Rubyencoder 传递它们
  3. 加密的 .rb 文件和其他文件被推送到加密存储库,保留提交消息,因此有 1:1 提交率
  4. 分支的创建和删除也被镜像。

与 git-encrypt 等解决方案不同,我们认为不安全的是客户的计算机,而不是代码存储库。

我的第一次尝试是一个很长的 post-recieve 钩子,它很慢而且分支不能正常工作,所以我放弃了它。

我的第二次尝试是设置 *.rb = rubyencode 并设置 cleansmudge 过滤器。虽然可以将 RubyEncoder 设置为在 /dev/stdin 上输入并在 /dev/stdout 上输出,但似乎这些会影响磁盘上的文件而不影响 git 历史记录,每次收到的推送都需要另一次提交。

服务器本地拉取和推送(git remote origin add git@git.work.com:product/work_unencrypted.gitgit remote set-url origin --push git@git.work.com:product/work_encrypted.git 使其从预期的存储库推送和拉取)将由 post-recieve 挂钩触发,如果 clean/smudge 按预期工作。

我已经够迷茫了,现在我什至不知道该问什么合适的问题。也许是如何单步执行和修改提交以保留 1:1 历史记录?

我会使用一些 CI 服务器(Jenkins、Travis、Buildbot...)来 运行 脚本,而不是使用挂钩和涂抹过滤器。您也可以使用 post-receive 挂钩,但仅用于 触发 任务(使用一些 IPC 机制),不要尝试 运行挂钩中的整个任务。

无论如何,我们假设工作存储库已经初始化并且触发分支已设置为 $GIT_BRANCH.

还需要这些远程定义:

git remote add unencrypted git@git.work.com:product/work_unencrypted.git
git remote add encrypted git@git.work.com:product/work_encrypted.git

那么脚本本身应该是这样的:

git fetch unencrypted
git checkout -f unencrypted/$GIT_BRANCH

while read -r FILE; do
    rubyencode $FILE
    git add $FILE
done < <( git diff HEAD..HEAD~ --name-only --diff-filter=ACMR \
         | grep .rb$ )

git commit --amend --no-edit
git push encrypted HEAD:$GIT_BRANCH