0

私たちの会社には、Rails に基づいたソフトウェア用の SVN リポジトリがあります。

また、暗号化されたリポジトリを手動で更新しました - 暗号化されていないプル、RubyEncoder でエンコード、暗号化されたプッシュ。

私たちはほとんど Git に移行しており、プロセスを自動化したいと考えています。私はプロセスを自動化し、コミットごとにしたいと考えています。

そう

  1. サーバーは、暗号化されていない任意のブランチへのプッシュを受信します
  2. サーバー フィルターは .rb ファイルを変更し、それらを Rubyencoder を介して渡します
  3. 暗号化された .rb ファイルとその他のファイルが暗号化されたリポジトリにプッシュされ、コミット メッセージが保持されるため、コミット率は 1:1 になります。
  4. ブランチの作成と削除もミラーリングされます。

git-encrypt のようなソリューションとは異なり、コード リポジトリではなく、安全でないと解釈するのはお客様のコンピューターです。

私の最初の試みは、受信後の長いフックでした。これは遅く、分岐が正しく機能しなかったため、放棄しました。

私の 2 番目の試みは、フィルタの設定と設定です*.rb = rubyencode。RubyEncoder は /dev/stdin で入力し、/dev/stdout に出力するように設定できますが、これらは git 履歴に影響を与えずにディスク上のファイルに影響するようで、受信したプッシュごとに別のコミットが必要です。cleansmudge

clean/smudge が期待どおりに機能していれば、サーバーローカルのプルとプッシュ (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 の履歴を保持するためにコミットをステップスルーして変更する方法ですか?

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 に答える