0

私はトリッキーな Git 状況を抱えています。私は単一の Git リポジトリを持っています。これを別の組織と共有し、変更を加えて私に送信できるようにする必要があります (そして、私が行った将来の変更を更新し続けます)。ただし、リポジトリには、法的に開示できない機密情報を含むファイルが多数あります。これらのファイルは、現在取り組んでいる作業にとって重要であるため、リポジトリから完全に削除することはできません。

理想的には、独自のファイルを別のリポジトリ/ライブラリに移動しますが、それはマイナーなリファクタリング プロジェクトになるので、できれば避けたいと思います。現在、プロプライエタリ ファイルと非プロプライエタリ ファイルはすべて、同じディレクトリ構造全体で混在しています。

私の目標は次のとおりです

  1. 独自のファイルを含まないリポジトリを提供します。リビジョン履歴にアクセスできなくてもかまいません。1 回のコミットで「新しい」コピーになる可能性があります。

  2. 私のリポジトリを更新するために、彼らが新しいコミットを私に送り返すことを許可してください。

  3. (理想的には) 彼らが私からの新しいコミットを受け入れることを許可します。これには、非独占的なファイルに加えられた変更のみが含まれます。

Git でこれを行う方法はありますか?

4

2 に答える 2

0

(これは以前の回答を完全に書き直したものです)

git checkout -b sanitized master
# do your sanitization work
git commit
git tag sanitization-prep
git checkout --orphan distributable
git commit
git checkout sanitized
git merge -s ours distributable
git tag distributable-base
git checkout master
git merge -s ours sanitized

その-s oursマージは、行ったすべての変更を、実際には適用せずに、すでにマスターにマージされているものとしてマークします。配布可能なコミットには親がないため、そのブランチを DMZ リポジトリにプッシュすると、それ以外は何も送信されません。

配布可能なブランチから変更をプルするとき

git checkout sanitized
git merge distributable
git checkout master
git merge sanitized

注意点が 1 つありmerge -s ours distributable-baseます。配布可能ファイルをマージする予定のすべてのブランチで、この作業を行う必要があります。それ以外は、あなたの仕事はまったく普通です。

アウトバウンド マージの手順についてはかなり理解できました。私がこれまでに持っているものは恐ろしいものです。

于 2013-05-14T05:03:41.683 に答える
0

これは、Git サブモジュールの仕事のように 思えます。それについて行く1つの方法は

  • cloneそれ自体の中にあなたのレポ
  • cd親レポへ、git submodule add <child repo>
  • 子リポジトリはプライベート ファイル用で、git rmその他のファイルは親リポジトリとの重複を避けるためのものです。

git filter-branch親リポジトリで、すべてのプライベート ファイルを削除する必要があります。これは、プライベート ファイルの最初のコミットまでさかのぼって履歴を書き直すため、物議を醸すステップです。

最後に、両方のリポジトリを維持し、心配なく親リポジトリを共有できます。

于 2013-05-14T01:18:23.567 に答える