Временная очистка неотслеживаемых файлов перед фиксацией в Git - PullRequest
4 голосов
/ 05 ноября 2010

Всякий раз, когда я фиксирую, я беспокоюсь о том, что, возможно, пропустил зависимость, и я ищу самый простой способ проверить мое git-дерево изолированно, чтобы убедиться, что все, что находится в git-индексе («staged»), будет на самом деле компилироваться / запустить самостоятельно.

Зависимости моего кода существуют в файловой системе, откуда я делаю 'git add', и поэтому простые компиляция и запуск тестов не гарантируют, что все, что я проверяю, скомпилируется / запустится, если дерево (или промежуточная область) было извлечено на чистая файловая система.

У меня может быть непрерывная сборка, которая будет проверяться после отправки, но я предпочитаю не иметь никаких плохих коммитов в истории, которые мне позже придется исправлять. Поэтому мне нужен способ создания изолированной среды, которая включает в себя проверку дерева, а также область индекса / промежуточной области.

Одна вещь, которую я рассмотрел, - это использование git stash дважды, т. Е .:

  1. Вызвать 'git stash', чтобы сохранить файлы в индексе
  2. Каким-то образом получить список файлов, которые не отслеживались, "git add", все эти файлы, сохранить новый тайник
  3. Удалить все ранее неотслеживаемые файлы
  4. Восстановить исходный тайник
  5. Теперь у меня должна быть чистая среда, в которой есть только проверенный код и код в промежуточной области, который я могу скомпилировать и протестировать.
  6. После завершения я восстанавливаю тайник неотслеживаемых файлов, а затем открываю их, чтобы оставить меня в том же положении, в котором я находился изначально.

(Эти неотслеживаемые файлы могут быть полезными, но не обязательно теми, которые я хочу зарегистрировать в репозитории - например, проекты eclipse).

У меня такое чувство, что я перерабатываю простую проблему, однако.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2010

Установите этот скрипт (или что-то в этом роде - мой тоже украден) как хук перед фиксацией. Он копирует индекс во временный рабочий каталог и запускает там сборку. Он будет ловить файлы, которые вы пропустили.

Я знаю, что есть как минимум один или два других SO вопроса, которые касаются именно этой проблемы - тестирование / проверка индекса вместо рабочего каталога в хуке перед фиксацией - но я не могу найти их правильными Теперь.

(Для полноты картины у меня есть этот скрипт в моем репозитории как .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 голос
/ 30 августа 2012

git stash -u --keep-index до испытания, затем git stash pop после испытания.

0 голосов
/ 05 ноября 2010

Настройка игнорирует важные файлы и просто стирает те, которые не важны git clean -df

...