2010-04-03 4 views
7

При включении предварительно получить крючок для репозитория мерзавца:Git предварительно получить крючок

Он не принимает никаких аргументов, но для каждого исх обновить он получает на стандартный ввод строки формата:

< старое значение> SP < новое значение> SP < реф-имя> LF

где < старое значение> старое название объекта хранится в реф, < новое значение> новое имя объекта для хранения в ref и является полным nam e of ref. При создании нового рефа, < старого значения> является 40 0.

Кто-нибудь может объяснить мне, как я исследую все файлы, которые будут изменены в хранилище, если я позволить это совершить?

Я хотел бы запустить эти файлы через некоторые скрипты, чтобы проверить синтаксис и так далее.

Спасибо.

ответ

18

Как ни странно, у меня был некоторый код, расположенный из утилиты git -> Wordpress, которая могла бы помочь. Ниже приводится список всех файлов, измененных в приеме, а также их содержимое. Никаких гарантий, может быть, ошибок, может быть, не самый эффективный способ сделать это, бла-бла-бла. Некоторые из этого кода основаны на вещах в gitshelve, что очень интересно посмотреть на общий git maniuplation.

+0

Спасибо за этот код, это очень помогло! Я сделал одну небольшую настройку для 'get_changed_files', поэтому он использует' --name-only', что облегчает анализ результатов: https://gist.github.com/1055516 – keegan3d

1

Если вы хотите знать, будут ли изменены права доступа к файлам в локальном хранилище до нажатия на удаленный репозиторий, запустите git ls-tree -r commit, где фиксации Ша фиксацию значения локального хранилища.

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

9

Я только что сделал это. Вот основной поток, который я использовал.

В вашей предварительно получить крюк, прочитайте каждую строку из стандартного ввода, который (как вы упомянули) выглядеть следующим образом:

oldref newref refname 
  1. Для каждого (oldref, newref) пара вам нужно перечислить все коммиты:

    git show --format=format:%H --quiet oldref..newref 
    
  2. для каждого коммита вам нужно перечислить все файлы:

    git diff --name-only commit^..commit 
    
  3. проверить файл, используйте GIT шоу:

    git show commit:filepath 
    

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

  4. после перебора всех рефов, совершает и файлы выход отличен от нуля, чтобы отклонить толчок, или ноль, чтобы позволить ему

Обратите внимание, что это подход выполняет все коммиты в порядке, поэтому, если файл изменен в нескольких коммитах, каждая версия будет проверена. Если вы хотите просмотреть только один файл в одно нажатие, перейдите в коммит в обратном порядке и просто не дважды изучайте данный файл. Однако я рекомендую использовать первый подход, так что все версии push-файлов проверяются.

+0

Почему-то я не смог избавиться от diff в 'git show --format = format:% H --quiet oldref..newref'. Возможно, потому, что я добавил новые файлы в репо, а diff был против/dev/null: D. Я думаю, что 'git log -format =% H oldref newref' должен делать то же самое, и нет diff :) –

Смежные вопросы