gitでコミットする前に、トラックされていないファイルを一時的にクリアします

StackOverflow https://stackoverflow.com/questions/4106622

質問

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

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

提出後にチェックする継続的なビルドを持つことができましたが、後でパッチをかけなければならない歴史の中で悪いコミットを持っていないことを好みません。したがって、ツリーのチェックアウトとインデックス/ステージング領域を含む孤立した環境を作成する方法が必要です。

私が検討したことの1つは、Git Stashを2回使用することです。

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

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

ただし、簡単な問題を抱えていると感じています。

役に立ちましたか?

解決

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

私は少なくとも1つまたは2つの他のものがあるので、この正確な問題に対処する質問(事前コミットフックでの作業監督の代わりにインデックスのテスト/検証)がありますが、私は今それらを見つけることができないようです。

(完全には、私はこのスクリプトに.git-hooks/pre-commit/test-the-indexとして私のレポを持っています。他にもいくつかのスクリプトがあります。フック/事前コミット。)

#!/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

他のヒント

git stash -u --keep-index テスト前に、続きます git stash pop テスト後。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top