4

元のタイトル: ブランチに関係なく、git がファイルを無視するようにする方法は?

期待どおりに機能する次のチェックアウト後のファイルがあります。

#!/usr/bin/ruby

cmd = ENV["HOME"] + "/dev/pitbull/cpp/bin/gen_version.rb --write"
`#{cmd}`

gen_version.rb スクリプトは、タイムスタンプ、最後のマスター タグ、および HEAD git ハッシュを計算し、同じく git にあるVERSION.hppファイルに書き込みます。

次にuse git update-index --assume-unchanged VERSION.hpp、gitに変更を無視させるために使用します。

さて、開発ブランチにとどまると、これはうまく機能します。しかし、私が試してみるとget checkout master、私はめちゃくちゃです:

git checkout master
error: Your local changes to the following files would be overwritten by checkout:
    cpp/inc/core/util/VERSION.hpp
Please, commit your changes or stash them before you can switch branches.
Aborting

チェックアウト時に VERSION.hpp を更新できるようにするための正しい git セットアップは何ですか?

EDIT 最終的な解決策は、実際にはSOのより多くのユーザーにとってより役立つ可能性のあるより広いトピックに対処するため、トピックを変更しました。したがって、このトピックは 2 つの方法で読むことができます。元のタイトルと以下の回答、または上記のより広範な問題、および以下のソリューション全体です。

4

1 に答える 1

3

元の問題に対処するには: ブランチに関係なく、git がファイルを無視するようにするにはどうすればよいですか?

  1. git rm cpp/inc/core/util/VERSION.hpp
  2. cpp/inc/core/util/VERSION.hpp を .gitignore に追加します

対処方法: 更新された git-hash を Version.hpp に埋め込むには?

この問題の一部は、すべてのファイルがチェックインされるまでハッシュを知ることができないという鶏卵の問題ですが、git ハッシュを知るまで、更新された VERSION.hpp をチェックインすることはできません。したがって、私の解決策は、 VERSION.hpp をリポジトリの外に残し、 .gitignore ファイルに入れることでした。

VERSION.hpp を実行可能ファイルに埋め込む目的を念頭に置いてください。本番環境で厄介なバグが発生した場合、バイナリに git-hash がある場合、コードを適切にデバッグできるように、git からチェックアウトするコードがわかります。 .

上記の 2 つの手順に加えて、次の手順を実行しました。

  1. ローカル領域がダーティかどうかに応じて、2 つのことを行う短い Ruby スクリプトを作成します ( git diff --shortstat0 行以上表示されている場合は、ダーティ領域があります)。 git rev-list HEAD | sed -n '1p' | cut -c1-10最初の 10 文字が git-hash として表示されます。ローカル エリアが汚れている場合、これは LAST HEAD の git-hash です (文字列 LAST を VERSION.hpp に埋め込みます)。これがクリーンであれば、それはあなたの真の現在の git-hash です。
  2. ruby スクリプトは、1. の結果と実際の VERSION.hpp ファイルを比較します。結果が変更された場合は、新しい結果を VERSION.hpp に書き込みます。
  3. .bashrc を変更して、2 つの小さなエイリアス (ローカルおよびリリース ディレクトリで cmake を呼び出すためのcmakerelcmakedbg ​​) を追加します。必要。

git チェックアウト後に cmakerel と cmakedbg​​ を呼び出し、ビルドの前にコードを変更しない場合 (とにかく実際のリリースでは行うべきではありません)、必要な VERSION.hpp とすべての適切な情報が得られます。埋め込み。

エイリアスを使用して .bashrc を変更する別の解決策は、(理論上) git のチェックアウト後のフックを使用することです。しかし、私はこれを機能させることができず、すでにこの問題に多くの時間を費やしていましたが、運がよかったかもしれません.

于 2012-11-17T15:39:56.810 に答える