3

最近、Git をワークフローに統合しましたが、その機能に感銘を受けました。それは優れた VCS であるだけでなく、ssh 経由でプッシュするときに FTP を周回しています。でも、今晩問題が発生しました。問題を解決するのを手伝ってくれる人がいたらと思っています。

プロジェクトには、追跡したいが本番環境にはプッシュしたくない特定のファイルがあります。リポジトリから特定のファイルを除外しながら、運用サーバーにプッシュする方法はありますか? 2 つの優れた例:

  • .less ファイルは実稼働サーバー上にある必要はまったくありませんが、絶対に追跡する必要があります
  • 私のローカル環境と実稼働環境は異なるドメインで運用されているため、.htaccess ファイルはわずかに異なります。ほとんどのルールは普遍的なものであるため (そして失われた場合に書き直すのは面倒です)、これらを引き続き追跡したいと考えていますが、ローカルの .htaccess をライブにプッシュするたびに、本番環境が壊れてしまい、手動でファイルを修正する必要があります。

可能であれば、すべてを単一のコミット/プッシュの下に保持したいと思います。私のワークフローは非常にシンプルで (この 1 つの点を除いて)、余分な手順を追加したり、要素を複雑にしたりすると、私は悲しいヘラジカになります。

役に立つかどうかはわかりませんが、Towerを使用してすべてを管理しています。

4

2 に答える 2

2

完全に素晴らしい解決策はありませんので、考慮すべきいくつかのオプションを紹介します。

まず、私は過去に、生産、qa、および開発用に別々のブランチを使用して、同様の状況に対処しました。これは、「ワンプッシュ」に対するあなたの欲求に違反しています。

次に、本当にすべてを単一のブランチに保持したい場合は、.gitignore を使用して特定のファイルを除外するという別の一般的な手法を使用できますが、さまざまなファイルへのソフトリンクを介して各作業ディレクトリにリンクします。リンクは、OSX、Unix 系 (Linux、FreeBSD など)、Windows NTFS など、ほとんどのオペレーティング システムで MKLINK コマンドを介してサポートされています。

リンクを使用してセットアップするには、.htaccess ファイルの名前を .htaccess-dev に変更し、それをコピーして、すべての環境で .htaccess-dev、.htaccess-qa に更新します。次に、.htaccess を .gitignore に追加し、最後に各環境で正しい環境へのソフトリンクを作成します。

たとえば、DEV システムが Windows の場合、次のように表示されます。

C:\code\dev-example>ren .htaccess .htaccess-dev

C:\code\dev-example>mklink .htaccess .htaccess-dev
symbolic link created for .htaccess <<===>> .htaccess-dev

C:\code\dev-example>dir
 Volume in drive C is Boot
 Volume Serial Number is DC8C-D5C9

 Directory of C:\code\dev-example

06/02/2014  06:12 PM    <DIR>          .
06/02/2014  06:12 PM    <DIR>          ..
06/02/2014  06:09 PM                10 .gitignore
06/02/2014  06:09 PM    <SYMLINK>      .htaccess [.htaccess-dev]
06/02/2014  06:08 PM                22 .htaccess-dev
06/02/2014  06:12 PM                23 .htaccess-prod
               4 File(s)             55 bytes
               2 Dir(s)  13,497,245,696 bytes free

C:\code\dev-example>type .htaccess
# Config file for DEV

C:\code\dev-example>type .gitignore
.htaccess

このアプローチは、いくつかのさまざまな構成ファイルに対してはうまく機能しますが、そのようなファイルが多数ある場合は扱いにくくなり、.less ファイルを除外したいという要望には実際には対応できません。

最後に、プロジェクトを再編成して開発専用コードを個別のフォルダーに分けることができる場合は、本番サーバーで git sparse-checkout を使用して、本番環境で必要なフォルダーのみを取得できます。ソフトリンクされた構成ファイルを使用することと組み合わせることで、dev/qa/prod で異なる作業フォルダーを維持しながら、シングルプッシュ ワークフローを実現できる可能性があります。http://briancoyner.github.io/blog/2013/06/05/git-sparse-checkout/を参照してください。

于 2014-06-03T00:24:28.753 に答える
1

特定のファイルなしでコミットをプッシュすることは、Git では不可能です。コミットは、その変更セットのハッシュとそれが基づいているコミット (変更セットと以前のコミットのハッシュ) によって識別されます。ファイルを除外すると、変更セットの少なくとも 1 つが変更され、ハッシュが変更されます (同じハッシュにヒットしない限り、言及する価値はほとんどありません)。

ただし、実稼働環境でファイルをチェックアウトから除外できる場合があります。それらはまだ運用マシン上にありますが、そこにあるローカル リポジトリの Git インデックス内に圧縮されており、スペースをほとんど占有せず、何にも干渉しません。

これを機能させるには、プッシュ先の実稼働環境のベア リポジトリにフックを設定できる必要があります。プッシュ時に、次のコマンドを使用する必要があります。

git archive --remote <path-to-bare-repo> --format tar <branch-to-checkout> | tar --extract --directory <path-to-extract> --exclude <pattern-of-files-to-exclude>

このコマンドは、通常のチェックアウトの代わりに、ブランチの現在のツリーの tar アーカイブ表現を作成します。tarそのアーカイブは、ディスク上の実際のファイルに変換するためにパイプされます。tar除外するファイルを指定できるフラグを受け入れ--excludeます。

于 2014-06-03T00:35:12.620 に答える