5

コミットするたびに、依存関係を見逃している可能性があるのではないかと心配しています。gitインデックス(「ステージング」)にあるものが実際にコンパイル/実行されることを確認するために、gitツリーを分離してテストする最も簡単な方法を探しています。彼ら自身。

私のコードの依存関係は、「git add」を実行するファイルシステムに存在するため、テストをコンパイルして実行するだけでは、ツリー(またはステージング領域)がクリーンなファイルシステムにチェックアウトされた場合に、チェックインしたものがコンパイル/実行されることは保証されません。 。

送信後にチェックする継続的ビルドを作成することもできますが、後でパッチを適用する必要がある履歴に不正なコミットがないことを望んでいます。したがって、ツリーのチェックアウトとインデックス/ステージング領域を含む分離された環境を作成する方法が必要です。

私が検討したことの1つは、git stashを2回使用することです。つまり、次のようになります。

  1. 'git stash'を呼び出して、ファイルをインデックスに保存します
  2. どういうわけか、追跡されていないファイルのリストを取得し、これらすべてのファイルを「git add」して、新しいスタッシュを保存します
  3. 以前に追跡されていないファイルをすべて削除します
  4. 元の隠し場所を復元する
  5. これで、コードのみが既にチェックインされ、コンパイルとテストが可能なステージング領域のコードのみが含まれるクリーンな環境ができました。
  6. 終了したら、追跡されていないファイルの隠し場所を復元し、追跡を解除して、元の位置と同じ位置に残します。

(これらの追跡されていないファイルは便利かもしれませんが、必ずしもリポジトリにチェックインしたいものではありません-例えば、Eclipseプロジェクト)。

ただし、単純な問題を過剰に設計しているような気がします。

4

3 に答える 3

3

このスクリプト(またはそのようなもの-私のものも盗まれます)をpre-commitフックとしてインストールします。インデックスを一時的な作業ディレクトリにコピーし、そこでビルドを実行します。それはあなたが逃したファイルをキャッチします。

この正確な問題に対処するSOの質問が少なくとも1つまたは2つあることは知っていますが、コミット前フックの作業ディレクトリの代わりにインデックスをテスト/検証しますが、現時点ではそれらを見つけることができないようです。

(完全を期すために、このスクリプトは.git-hooks / pre-commit / test-the-indexとしてリポジトリにあります。他にもいくつかのスクリプトがあります。.git/として使用しているものについては、以下を参照してください。フック/事前コミット。)

#!/bin/sh
#
# Via: http://github.com/jwiegley/git-scripts/blob/master/pre-commit.sh
#

if [ ! $(git rev-parse --symbolic-full-name HEAD) = refs/heads/master ]; then
    exit 0
fi

# These are the locations I keep my temporary source and build trees in
TMPDIR=$HOME/code/myproject-pre-commit
MIRROR=$HOME/code/myproject-pre-commit-mirror

# Exit with status 1 if any command below fails
set -e

# Checkout a copy of the current index into MIRROR
git checkout-index --prefix=$MIRROR/ -af

# Remove files from MIRROR which are no longer present in the index
git diff-index --cached --name-only --diff-filter=D -z HEAD | \
    (cd $MIRROR && xargs -0 rm -f --)

# Copy only _changed files_ from MIRROR to TMPDIR, without copying timestamps.
# This includes copying over new files, and deleting removed ones.  This way,
# "make check" will only rebuild what is necessary to validate the commit.
rsync -rlpgoDOc --delete --exclude-from=.git-hooks/excludes $MIRROR/ $TMPDIR/

# Everything else happens in the temporary build tree
cd $TMPDIR

nosetests

exit 0

これは私の実際の.git/hooks /pre-commitです:

#!/bin/bash

set -e
for hook in $(find .git-hooks/pre-commit -perm /u+x,g+x,o+x -type f -not -name '*~' 2>/dev/null)
do
  echo "@@ Running hook: $(basename $hook)"
  $hook "$@"
done
于 2010-11-05T16:43:25.820 に答える
2

git stash -u --keep-indexテスト前、テストgit stash pop後。

于 2012-08-30T10:18:43.520 に答える
0

セットアップは重要なファイルを無視し、重要でないファイルを単に消去しますgit clean -df

于 2010-11-05T14:12:22.793 に答える