Временно очистить неперерабатываемые файлы перед фиксацией в Git

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

Вопрос

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

Зависимости моего кода существуют в файловой системе, откуда я делаю «GIT Add», и настолько простые компиляции и запущенные тесты, не гарантируют, что все, что я проверял, будет компилировать / запустить, если дерево (или площадь постановки) проводится оформить заказ на чистую файловую систему. Отказ

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

Одна вещь, которую я считал, использует Git Stash дважды, то есть:

  1. Вызовете «Git Stash», чтобы сохранить файлы в индексе
  2. Как-то получить список файлов, не отслеживаемых, «Git Add» все эти файлы, сохранить новый Stash
  3. Удалить все ранее ненужные файлы
  4. Восстановить оригинальный Stash
  5. Теперь я должен иметь чистую среду, которая имеет только код, который уже проверен, и код в области постановки, который я могу компилировать и тестировать.
  6. После того, как я закончил, я восстанавливаю тайник незаконных файлов, а затем отказался от них, чтобы оставить меня в том же положении, в котором я был первоначально.

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

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

Это было полезно?

Решение

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

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

(Для полноты у меня есть этот скрипт в моем репо, как .GIT-крючки / предварительный коммит / тест-индекс; есть пара других сценариев. Увидеть ниже для того, что я использую как .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

Другие советы

git stash -u --keep-index перед тестом, а затем git stash pop После теста.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top