0

我们公司有一个基于 Rails 的软件的 SVN 存储库。

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

我们大部分时间都过渡到了 Git,并且想让这个过程自动化,我想让这个过程自动化,并且每次提交。

所以

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

与 git-encrypt 之类的解决方案不同,我们将其解释为不安全的是客户的通勤者,而不是代码存储库。

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

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

如果 clean/smudge 按预期工作,服务器本地的拉取和推送(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 钩子触发。

我已经迷失了,我什至不知道此时要问的正确问题。也许这是如何逐步完成和修改提交以保持 1:1 的历史?

4

1 回答 1

2

我会使用一些 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
于 2016-04-06T22:13:32.650 回答