如何让服务器在收到未加密推送后自动推送到加密 Git 存储库
How to make server automatically push to Encrypted Git Repository after recieving Unencrypted push
我们公司有一个基于 Rails.
的软件的 SVN 存储库
我们还有一个手动更新的加密存储库 - 提取未加密,使用 RubyEncoder 编码,推送到加密。
我们大部分时间都已过渡到 Git,并且希望使流程自动化,我希望流程自动化,并且每次提交。
所以
- 服务器接收到未加密的任何分支的推送
- 服务器过滤器更改了 .rb 文件,通过 Rubyencoder 传递它们
- 加密的 .rb 文件和其他文件被推送到加密存储库,保留提交消息,因此有 1:1 提交率
- 分支的创建和删除也被镜像。
与 git-encrypt 等解决方案不同,我们认为不安全的是客户的计算机,而不是代码存储库。
我的第一次尝试是一个很长的 post-recieve 钩子,它很慢而且分支不能正常工作,所以我放弃了它。
我的第二次尝试是设置 *.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
使其从预期的存储库推送和拉取)将由 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
我们公司有一个基于 Rails.
的软件的 SVN 存储库我们还有一个手动更新的加密存储库 - 提取未加密,使用 RubyEncoder 编码,推送到加密。
我们大部分时间都已过渡到 Git,并且希望使流程自动化,我希望流程自动化,并且每次提交。
所以
- 服务器接收到未加密的任何分支的推送
- 服务器过滤器更改了 .rb 文件,通过 Rubyencoder 传递它们
- 加密的 .rb 文件和其他文件被推送到加密存储库,保留提交消息,因此有 1:1 提交率
- 分支的创建和删除也被镜像。
与 git-encrypt 等解决方案不同,我们认为不安全的是客户的计算机,而不是代码存储库。
我的第一次尝试是一个很长的 post-recieve 钩子,它很慢而且分支不能正常工作,所以我放弃了它。
我的第二次尝试是设置 *.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
使其从预期的存储库推送和拉取)将由 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