Подтвердить что ты не робот

Может ли крюк Git автоматически добавлять файлы в коммит?

Я хотел бы добавить автоматически сгенерированный файл к тому же фиксации, используя крюк pre-or post-commit в Git, зависящий от файлов, которые были изменены в этой фиксации. Как я могу это сделать?

Я пробовал это как крюк с предварительной фиксацией, но не повезло:

#!/bin/sh
files=`git diff --cached --name-status`
re="<files of importance>"
if [[ $files =~ $re ]]
then
  echo "Creating files"
  exec bundle exec create_my_files
  exec git add my_files
  exec git commit --amend -C HEAD
fi

Это успешно добавляет их в репозиторий, но не добавляет их в commit. Я также пробовал использовать последние две строки exec в блоке post-commit вместе с проверкой pre-commit, но ничего хорошего тоже.

4b9b3361

Ответ 1

Это позволяет делать то, что вы хотите, с помощью перехватов. Мы делаем что-то подобное для развертывания heroku (компиляция coffeescript в javascript). Причина, по которой ваш script не работает, заключается в том, что вы неправильно использовали команду exec.

На странице :

Встроенный exec используется для замены текущего образа процесса оболочки новой командой. При успешном завершении exec никогда не возвращается. exec не может использоваться внутри конвейера.

Выполняется только ваша первая команда exec. После этого ваш script в основном завершается.

Дайте что-то вроде этого попробовать (как крючок с предварительной фиксацией):

#!/bin/sh
files=`git diff --cached --name-status`
re="<files of importance>"
if [[ $files =~ $re ]]
then
  echo "Creating files"
  bundle exec create_my_files
  git add my_files
fi

Ответ 2

Так как git add также не работал у меня в pre commit, я следил за идеей использования файла .commit и разбивки процесса на pre- и post-commit.

Вот какой код, который должен быть легко понят

В pre-commit:

  • Коснитесь файла .commit или что-то еще. (обязательно добавьте это в .gitignore)
#!/bin/sh 
echo 
touch .commit 
exit

В post-commit:

Если .commit существует, вы знаете, что фиксация только что состоялась, но пост-фиксация еще не запущена. Итак, вы можете сделать свое генерация кода здесь. Кроме того, проверьте наличие .commit и если он существует:

  • добавить файлы
  • commit --amend -C HEAD --no-verify (исключить цикл)
  • удалить .commit файл
#!/bin/sh
echo
if [ -a .commit ]
    then
    rm .commit
    git add yourfile
    git commit --amend -C HEAD --no-verify
fi
exit

Надеюсь, это облегчит людям с небольшим знанием bash, чтобы следовать идее маркировки.

Ответ 3

Вы можете использовать комбинацию pre и post commit script.

В pre-commit:

  • Коснитесь файла .commit или что-то еще. (обязательно добавьте это в .gitignore)

В post-commit:

Если .commit существует, вы знаете, что фиксация только что состоялась, но пост-фиксация еще не запущена. Итак, вы можете сделать свое генерация кода здесь. Кроме того, проверьте наличие .commit и если он существует:

  • добавить файлы
  • commit --ammend -C HEAD --no-verify (исключить цикл)
  • удалить .commit файл

Это примерно тот процесс, который я использую для хранения файла .metadata в репозитории, созданного из метастора.

Если кто-то знает лучший способ, я все уши, но теперь он работает.

Ответ 4

#!/bin/sh
#
#  .git/hooks/pre-commit
#

git add file.xyz

Это сработало для меня отлично. Он будет частью текущей фиксации.

git version 1.7.12.4 (Apple Git-37)

Ответ 5

Вы можете использовать update-index:

git update-index --add my_files

Ответ 6

Как насчет того, чтобы вместо этого генерировать post-commit script, который генерирует ваши файлы, и затем делать это (что-то по строкам) git add my_files; git commit --amend.

Ответ 7

Если файлы автоматически генерируются, и они могут быть сгенерированы в любом месте (подразумевается в вашем желании построить их в Git pre-commit hook), вы не должны ставить их под контроль источника в первую очередь. Вы должны контролировать только исходные файлы. Сгенерированные файлы должны быть сгенерированы как часть скриптов сборки.

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

Добавлен

От http://git-scm.com/docs/githooks:

pre-commit Этот крюк вызывается gitсовершить и может быть обойден --no-verify. Он не принимает параметров и вызывается перед получение предлагаемого журнала фиксации сообщение и совершение фиксации. Выход с ненулевым статусом от этого scriptзаставляет Git commit прерывать.

Ключ предварительной фиксации по умолчанию, когда включено, улавливает введение линий с завершающими пробелами и прерываниями фиксация, когда такая строка найдена.

Вызывается все крючки фиксации Gitс переменной окружения GIT_EDITOR =: если команда не будет вызвать редактора, чтобы изменить сообщение фиксации.

Целью крюка предварительной фиксации является проверка проверки прохода на состояние рабочей области и содержимого фиксации до совершения фиксации. Попытка изменить содержимое коммита не будет работать.

Моя рекомендация добавила бы два шага к вашим скриптам сборки: (1) шаг, на котором будут созданы все устаревшие файлы, которые должны быть сгенерированы (и добавлены в рабочую область), и (2) шаг, который будет проверять, чтобы все сгенерированные файлы были обновлены и возвращали ненулевой код состояния. Ваш Git pre-commit hook должен запустить второй шаг. Ваши разработчики должны быть обучены выполнять первый шаг по мере необходимости.

Ответ 8

У меня была такая же потребность, и этот подход работал очень хорошо для меня:

#!/bin/sh
files='git diff --cached --name-only'
re="<files of importance>"
if [[ $files =~ $re ]]
then
   echo "Creating files"
   create_my_files && git add my_files
fi

где "create_my_files" должен быть исполняемым, например, если это файл python, вы можете выполнить его как "python create_my_files & git добавить my_files"

и это правда, вам не нужна предварительная фиксация для совершения снова (что создало бы бесконечный неприятный цикл: p)

Ответ 9

Да, вы можете добавлять сгенерированные файлы автоматически при фиксации с помощью git hooks! Но для этого требуется сложный script.

Здесь вы можете найти решение проблемы. Там он обновляет версию файла при каждой фиксации, добавляет новый измененный файл и исправляет фиксацию по мере необходимости. Он полностью работает: https://github.com/evandrocoan/.versioning

Затем вы просто замените алгоритм замены файла версии на файл updateVersion.sh вашим алгоритмом. Возможно, вам нужно изменить несколько вещей, например, удалить ограничение ветвления, потому что там script работает только в том случае, если вы находитесь на ветке разработки.

Кроме того, он будет изменять только указанный файл, если он поставлен. Если файл не поставлен, он не будет делать ничего, кроме обычного/обычного фиксации. Точнее, он печатает, что он делает на каждом шагу.

Я собираюсь объяснить, этот трюк. Это довольно сложно. На hook-commit-commit-connect-hook он определяет, будет ли поставлен и зафиксирован желаемый файл. После этого он создает файл флага и останавливает hook-commit-commit-msg-hook. Позже, после фиксации, он проверяет, существует ли файл флага. Если да, то он изменяет файлы на фиксации.

Внимание, это создало бы цикл бесконечности, потому что он снова вызовет hook-make-commit-msg-hook (по мере внесения изменений). Но этого не происходит из-за файла флага. Когда выполняется make-commit-msg-hook и находит файл флага, он "знает", что происходит. Затем просто удаляет файл флага и не создает его снова. Выполняя это, он блокирует попытку совершения совершения совершения совершения совершения совершения совершения совершения совершения сделки.

Ответ 10

Я столкнулся с такой же проблемой и в pre-commit hook. Я редактировал один файл и фиксировал его, но он принимал предыдущий файл, не обновляемый файл, поэтому, добавив команду git (как показано ниже) в pre-commit hook, он решил.

git add $file

Примечание: $file - ваш файл, который нужно добавить.

Спасибо,