0

リポジトリの 2 つの異なる「ビュー」を維持したいと考えています。1 つはコード全体を表示するアクセス制御を備えたもので、もう 1 つはいくつかのディレクトリが削除された公開のものです。

これは git または svn で可能ですか? おそらく、ミラーリング スクリプトの何らかの形式を使用してですか?

両方のリポジトリで同じリビジョンを維持し、公開リポジトリのユーザーがパッチを送信できるようにしたいと考えています。

前もって感謝します。これは奇妙なものだと思います!

詳細については編集してください:

非常に大規模でかなり複雑なオープン ソース アプリケーションを開発しています。私たちのユーザーは現在、svn から直接更新しています。私たちの目的には、tarball よりもはるかにうまく機能します。

一般にアクセス可能な svn リポジトリがあり、小さなバグの修正を迅速に展開し、誰もが 1 つのコマンドでそれらをダウンロードできるようにします。データベース スキーマを維持するためのシステムもあります。基本的に、私たちはこのシステムから離れたくありません。

商用ライセンシーのみが利用できる機能がいくつかあります (ダンボール箱とラーメンの代金を支払う必要がありますよね?)。私は基本的に、「マスター」リポジトリを認証を要求するように移動し、パブリック リポジトリをそのリポジトリのミラーにして、非フリー コードを削除したいと考えています。

たとえば、認証されたユーザーには次のように表示されます。

html/index.php
html/includes/functions.php
html/includes/non-free/functions.php

ただし、パブリック ユーザーには次のように表示されます。

html/index.php
html/includes/functions.php

2 つのツリーを別々に維持しようとするのは、本当に本当にしたくありません。おそらく、無料バージョンのコードが大幅に遅れてしまい、無料バージョンのバグを修正することが難しくなります。

4

2 に答える 2

3

Git についてはわかりませんが、Subversionではパスベースの承認を使用できます。

このようなものが動作するはずです:

[yourRepo:/]
commercial = r
public = r

[yourRepo:/html/includes/non-free/]
public = 
于 2013-08-19T00:20:31.160 に答える
2

きれいではなく、ひどく非効率的ですが、仕事は完了します。アクセスできる人がクローン、フェッチ、およびオプションでプッシュできるプライベート git リポジトリを用意します。それを使用してレポを複製し、適用git filter-branchして削除し、一般にアクセス可能なものとして公開します。

(テストされていない)例として、sshアクセスを必要とし、一般に「プライベート」であり、公開されるべきではないリポジトリが含まれていると仮定します--baresome.hostsecret.txt

$ git clone --bare ssh://some.host/path/to/private.git new_public.git
$ cd new_public.git                      # don't let the public see this yet!
$ git filter-branch --index-filter 'git rm --cached \
--ignore-unmatch secret.txt' -- --all    # add --tag-name-filter etc if needed
$ rm -rf refs/original                   # and do pruning, etc; see man page
# note (as per man page) that you can clone this again instead, might be easier
$ cd ..
$ mv new_public.git /path/to/public.git  # now it's safe; publish it

パブリック リポジトリでのコミットは、プライベート リポジトリでのコミットとは異なりますが、パブリック リポジトリに作成されたパッチを適用することはできます。git applyorを使用git amして、それらをプライベート レポジトリ (のクローン) に作成します ... 次に、前と同じことを実行して、パブリックレポジトリを再生成します: 同じ、-into-cloneなど (最初の を公開する前に、引数の設定とテストに多くの時間を費やすため、とにかくすべてをスクリプトに入れる必要があります。)git clone --barecdgit filter-branchfilter-branchpublic.git

これが機能する理由 (うまくいくと思いますが、テストしていないことに注意してください) はfilter-branch、 all-newnew_public.gitに変更を加えると、同じ originalsから始めて、前回と同じ変更を行い、結果として以前と同様にビットごとに同一のコピーであるため、コミットは前回実行したときと同じ SHA-1 値を持ちます。「上に」追加された新しいコミットのみが異なります。それは、.git filter-branchpublic.git

毎回同じ(かなり重い)作業をやり直すので効率的ではありません。(効率的にするには、差分をプライベート リポジトリだけに適用するのではなく、プライベート リポジトリとパブリック リポジトリの両方に適用します。プライベート リポジトリの状態をどこかに保存し、必要なすべてのパッチを計算し、それらすべてを適用するスクリプトを作成して、これを自動化します。パブリック リポジトリにパッチを適用し、保存されたプライベート リポジトリの状態を更新します. しかし、同期が外れてフィルター ブランチ全体をやり直さなければならない場合、パブリック リポジトリのユーザーは不安になる可能性があります。コミットのタイムスタンプなど、わずかな違いがあります。)

于 2013-08-18T23:52:14.457 に答える