作業しているリポジトリがあります。そこに1つのフォルダがあり、オープンソースにしたいものをすべて配置して、プライベート部分とは別にしています。新しく変更されたファイルを毎回そこにプッシュすることを忘れずに、gitにそのフォルダーにコミットされたものをgithubリポジトリに自動的にプッシュさせる方法はありますか?リポジトリ全体を別のgithubの場所にプッシュしたいと思います。
2 に答える
パーツがパブリックであり、パーツがプライベートであることが意図されている単一のリポジトリがある場合は、リポジトリ設定で何かを根本的に変更する必要があります。gitは完全なリポジトリを追跡するため、リポジトリをパブリックまたはプライベートにすることができますが、一部はこれで、一部はそれではありません。
「public」ファイルを含むリポジトリと「private」ファイルを含むリポジトリの両方がある場合は、「public」リポジトリにgitフックを追加して、コミットを自動的にプッシュし、プライベートリポジトリをプライベートに保つことができます。
ただし、「public」ファイルと「private」ファイルの両方を含む単一のリポジトリがあると書いているので、それを「public」と「private」に分割する必要があります。
この状況を解決するには、いくつかのオプションがあります。
「public」フォルダーを、githubにプッシュする独自のリポジトリに分割します。これにより、「public」フォルダの履歴が少し書き換えられます。これについては、以下で詳しく説明します。
「public」フォルダのみに関係するブランチを作成し、そのブランチのみを公開します。これは「誤ってプッシュする、つまり公開する、プライベートなもの」という意味では危険であり、「パブリック」ファイルと「プライベート」ファイルの両方に触れるコミットがある場合は、完全に不可能または少なくとも非常に困難です。オプションであり、それについてはこれ以上書きません。
「public」フォルダを独自のリポジトリに分割するには、「combined」ブランチから新しい「public」ブランチを作成し、それを使用git filter-branch
して、新しい「public」ブランチに「public」フォルダからのものだけを含めるようにします。「例」セクションには、適切な--subdirectory-filterの例が示されています。次に、「public」フォルダーとプライベートのものの両方を含む古い「combined」ブランチと、「public」フォルダーのみを含む新しい「public」ブランチの両方が作成されます。
たとえば、新しい「パブリック」ブランチのコミットメッセージには、まだ「プライベート」情報が含まれている可能性があることに注意してください。したがって、すべてのコミットメッセージを確認し、それらをスキャンして個人情報を探し、場合によってはその個人情報を編集する必要がありgit rebase -i
ます。
更新: [その後の「パブリック」ブランチのみのプッシュと他の何も転送されない可能性があるため、このリポジトリのクリーンアップはおそらく必要ありません。]編集を行う必要がある場合は、編集されていない古いものを削除する必要があります。を使用したリポジトリからの回転数
git gc
(おそらく--prune=0
と--aggressive
オプションを使用しますが、それに関する詳細情報を含むSOの回答は見つかりません)。
これで、「パブリック」ブランチを公開する準備が整いました。「公開」情報のみが含まれていることを確認するには、それを新しい空のローカルベアリポジトリにプッシュし、その内容を調べて、すべての参照に個人情報がないことを確認します。満足したら、「public」ブランチをgithubの新しい空のリポジトリにプッシュできます。githubのリポジトリには、「public」ブランチのみが含まれます。これは、おそらくgithubリポジトリで「master」という名前にする必要があります。
「結合された」ブランチを持つローカルリポジトリには、パブリック情報とプライベート情報の両方が直接含まれており、新しい「パブリック」githubリポジトリとはまったく関係がありません。
これで、「結合された」ブランチの履歴を書き換えて、非公開ビットのみを含めることができますが、これにより、すべての履歴中の「公開」ファイルと「非公開」ファイルの状態間のすべての接続が犠牲になるため、古いものを繰り返しビルドすると、ほぼ不可能になります。したがって、「結合された」ブランチの履歴はそのままにして、新しいコミットで「public」フォルダーを削除することをお勧めします。
プライベートファイルとパブリックファイルの統合が非常に緊密でバージョンに依存している場合はgit submodule
、githubからプライベートリポジトリに「パブリック」リポジトリの特定のバージョンを追加するために使用できます。以前の「public」フォルダと同じ名前の新しいサブモジュールフォルダは、すべての「public」ファイルが古いパスにあるため、プライベートなものへの変更を最小限に抑えます。何かがgithubにプッシュされた場合、サブモジュールフォルダーは自動的に更新されないことに注意してください。これを回避するには、ローカルサブモジュールフォルダーにgitフックを追加して、「結合された」リポジトリのサブモジュール情報を更新します。
プライベートファイルとパブリックファイルの統合が緩い場合は、パブリックファイルを外部のサードパーティプロジェクトのように扱い、他の誰かが統合するのと同じように、つまり外部のあなたの「プライベート」ソフトウェアが依存するソフトウェア。
githookを使用してコミットをプッシュします。