在Git中提交之前暂时清除未跟踪的文件

时间:2010-11-05 14:08:46

标签: git testing commit pre-commit

每当我提交时,我担心我可能错过了一个依赖项,我正在寻找最简单的方法来单独测试我的git树以确保git索引中的任何内容(“staged”)实际上都会编译/自己跑。

我的代码的依赖项存在于我执行'git add'的文件系统中,所以简单的编译和运行测试并不能保证无论我检查的是什么,如果树(或暂存区域)结帐到一个干净的文件系统。

我可以有一个连续的构建,可以在提交后进行检查但是我不希望在历史记录中有任何不好的提交,我以后必须修补。因此,我想要一种创建隔离环境的方法,包括树的结帐以及索引/暂存区域。

我考虑过的一件事是两次使用git stash,即:

  1. 调用'git stash'将文件保存在索引
  2. 以某种方式获取未跟踪的文件列表,'git add'所有这些文件,保存新藏匿
  3. 删除所有以前未跟踪的文件
  4. 恢复原始存储
  5. 我现在应该有一个干净的环境,只有已经签入的代码和我可以编译的暂存区域中的代码。测试
  6. 一旦完成,我会恢复未跟踪文件的存储,然后解除它们,使我处于与原来相同的位置。
  7. (这些未跟踪的文件可能很有用,但不一定是我想要检查到存储库的东西 - 例如eclipse项目。)

    但是,我有一种感觉,我正在过度设计一个简单的问题。

3 个答案:

答案 0 :(得分:2)

安装此脚本(或类似的东西 - 我的也被盗)作为预提交钩子。它将索引复制到临时工作目录并在那里运行构建。它会捕获你错过的文件。

我知道至少还有一两个SO问题可以解决这个问题 - 在预提交钩子中测试/验证索引而不是工作目录 - 但我似乎无法找到它们现在

(为了完整性,我在我的repo中有这个脚本作为.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

答案 1 :(得分:1)

测试前

git stash -u --keep-index,测试后跟git stash pop

答案 2 :(得分:0)

设置忽略重要文件,只删除那些不重要的文件git clean -df