1

Puppet Dev/Test サーバーの git 構成は次のようになります。

  1. 開発者は自分の /home ディレクトリに作業ディレクトリを持っており、ここで実際に構成を変更します。
  2. 変更は、各作業ディレクトリから中央のベア リポジトリにプッシュされます。
  3. 変更は、テストが行​​われる Development ディレクトリに取り込まれます。
  4. その後、変更は本番リポジトリにプルされます。ただし、本番リポジトリでは、開発からのホスト固有の情報を持つ manifests/ ディレクトリを無視したいと考えています。運用リポジトリには他のマニフェストが含まれるか、マニフェストを他の場所で制御できないようにするという考えです。

リポジトリからディレクトリを削除し、.gitignore ファイルにエントリを追加するgit statusと、本番リポジトリにコミットする必要がある変更 (削除されたディレクトリ) があり、開発リポジトリよりも 1 つコミットされていることがわかります。

私が見つけたのは、ファイルシステムにディレクトリを残しながら.gitignoreにディレクトリを追加することで、これが軽減されることです。ただし、Production manifests ディレクトリにホストの別のリストを保持することを選択した場合、状況はすぐにナシ型になる可能性があります。

他に考えられる唯一の方法は、Dev マニフェストとモジュール ディレクトリに個別のリポジトリを作成することです。これにより、マニフェストをそのままにして、モジュールの更新を Prod に取り込むことができます。次に、/home ディレクトリ リポジトリから別のリポジトリ チェーンを作成し、Production マニフェストだけを格納するための新しい中央のベア デポを介して、そこから個別にプルすることができます。ただし、Production ディレクトリの下に既に git リポジトリを作成しているため、これはスターターではないことがわかります。1 つのディレクトリを 2 つのリポジトリで提供することはできませんね。

おそらく、マニフェストとモジュールの各ディレクトリの git リポジトリをそれらのディレクトリの下に配置する必要があります。

それは実行可能な方法ですか?この問題に対する他の一般的な解決策はありますか? 私はgitにかなり慣れていないので、gitがどれほど堅牢であるかに精通していません。

編集:私がやろうとしていることを表す図へのリンク: Puppet git repo diagram。各環境でノードの個別のマニフェストを保持したい理由がわかります。

4

2 に答える 2

0

2 番目のレポの代わりに、次のようなスクリプトを Prod に用意してみませんか。

  • Dev の変更を Prod git リポジトリの独自のブランチにフェッチする
  • そのブランチ Dev on をマージしてmasterから、次のようにします。
    • 製品固有の必要な変更を行い、
    • それらの変更を追加します
    • masterそれらをProd リポジトリにコミットします。
于 2013-09-11T05:47:00.630 に答える
0

リポジトリからフォルダーを削除し、.gitignore に追加してから、変更をコミットします。そのコミットを中央の裸のレポにプッシュすると、(ほとんど) 問題ありません。

フォルダーを削除したときに git がコミットされていない変更を表示する理由は、実際に何かを変更したためです。フォルダを削除しました。gitignore はそれを止めません。実際、追跡されたファイルを に追加すると.gitignore、git はそのファイルを無視しません(フォルダーにも同じことが当てはまります)。.gitignore追跡されていないファイルに対してのみ機能します。

したがって、リポジトリ内のファイルを追跡解除するには、それらを削除して (または少なくとも git にそう思わせるようにし) .gitignore、. 作業ディレクトリから実際にファイルを削除せずにそれを行うことができます:

git rm --cached <files>

実際のファイルは作業ディレクトリ内に残りますがgit status、削除済みとして表示されます。それらを.gitignore同時に追加すると、ファイルはgitが気付かずに永久にそこに残ります。

ただし、その変更をコミットし、それが別の場所にプルされると、git は実際にファイルを削除したと見なすため、ファイルは削除されます。したがって、これらのファイルを元に戻す必要があります (これらのファイルが に追加されたときに、git がこれらのファイルを再び追跡することはありません.gitignore)。

git checkout HEAD~1 <files>

これにより、その単一のレポにファイルが戻されます。上記で行ったコミットをプルしたすべてのリポジトリに対してこれを行う必要があります。

于 2013-09-11T08:27:11.763 に答える