我们公司拥有一个基于Rails的软件的SVN存储库。
我们还有一个手动更新的加密存储库 - 拉未加密,使用RubyEncoder进行编码,推送到加密。
我们主要过渡到Git,并且希望自动完成该过程,并且我希望自动完成该过程,并且每次提交。
所以
与git-encrypt这样的解决方案不同,它是客户的计算机,我们将其解释为不安全,而不是代码存储库。
我的第一次尝试是一个很长的接收后钩子,它很慢并且分支没有正常工作,所以我放弃了它。
我的第二次尝试是设置*.rb = rubyencode
并设置clean
和smudge
过滤器。虽然可以将RubyEncoder设置为在/ dev / stdin上输入并输出到/ dev / stdout,但似乎这些影响磁盘上的文件而不影响git历史记录,每次接收推送需要另一次提交。
服务器本地的拉动和推动(git remote origin add git@git.work.com:product/work_unencrypted.git
和git remote set-url origin --push git@git.work.com:product/work_encrypted.git
以使其从预期的存储库推送和拉出)将由后接收钩子触发,如果清洁/涂抹是按预期工作。
我已经迷失了,我甚至不知道在这一点上要问的正确问题。也许它是如何跨越&修改提交以保持1:1的历史记录?
答案 0 :(得分:1)
我会使用一些CI服务器(Jenkins,Travis,Buildbot ......)来运行脚本,而不是使用钩子和涂抹过滤器。你也可以使用post-receive hook,但是只使用它来触发任务(使用一些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