Как узнать список всех измененных файлов в git для полной сборки jenkins, а не для конкретной фиксации?

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

git show --pretty = "format:" - name-only будет выполнять сборку только для файлов с отменой фиксации. Таким образом, мне нужно создать для всех измененных файлов в разных коммитах с момента последней успешной сборки.

Например, последняя сборка выполнена в Jenkins при X SHA-1 id, и после этого на ней есть еще 3 фиксации. Итак, моя цель - проверить всю базу данных репозитория до головы, а затем узнать список всех файлов, которые были изменены после X SHA-1 id, которые составляют 3 коммита поверх последнего фиксации на X SHA-1 id?

Спасибо

Ответ 1

Немного поздно вечеринке, но немного лучше - использовать функциональность --name-only на git diff. Я использовал следующее:

git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT

Таким образом, после этого вам не придется выполнять некоторые работы по трубопроводу.

Ответ 2

Согласно https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-Environmentvariables, Jenkins предоставляет переменные окружения:

  • GIT_COMMIT - SHA текущего
  • GIT_PREVIOUS_COMMIT - SHA предыдущего встроенного коммита из той же ветки (текущий SHA при первом построении в ветке)

Я планирую использовать их для достижения чего-то подобного.

Итак, что вам нужно, это что-то вроде:

tar cvzf /tmp/build.tar.gz `git diff --stat $GIT_PREVIOUS_COMMIT $GIT_COMMIT | grep '\|' | awk '{print $1}'`

Ответ 3

Я не совсем уверен, что следую вашему вопросу, но две вещи, которые следует учитывать:

  • git diff --stat {X SHA-1 ID} должен работать на то, что вы ищете. Или, вы можете быть более явным и сделать git diff --stat {X SHA-1 ID} {X SHA-1 ID + 3 commits}, который даст вам файлы изменений между двумя указанными коммитами. Это выведет что-то вроде:

    Library/ENV/4.3/cc                |  3 ++-
    Library/Formula/cmu-sphinxbase.rb | 10 +++++++---
    Library/Formula/fb-client.rb      | 11 +++++++++++
    

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

  • Вероятно, вы должны сделать полную, чистую сборку в Jenkins, и не только создавать определенные файлы. В конечном итоге вы можете столкнуться с необычной несовместимостью между встроенными файлами. Но это выходит за рамки этого вопроса.

--- Редактировать с дополнительной информацией ---

Чтобы разбить эту проблему на части:

  • Получить хеши SHA1 для работы с. Вам нужен текущий HEAD репо (проверка ревизии, которую мы назовем $CUR_HASH) и фиксация, когда последний построил Jenkins (Last Build Revision, который мы вызовет $LAST_HASH). Похоже, что у вас уже есть эти, а если нет, то это выходит за рамки вопроса.
  • Получить список файлов, измененных между $LAST_HASH и $CUR_HASH. Это вышеназванная команда git diff --stat $LAST_HASH $CUR_HASH, которая выведет что-то вроде выше.
  • Получите только имена файлов из выходного - сделав это в bash, вы можете передать вывод git diff в grep '\|', чтобы получить только строки с именами файлов, и затем проведите его до awk '{print $1}, чтобы получить только имя файла, без статистики. Итак, команда теперь выглядит примерно так:

    git diff --stat $LAST_HASH $CUR_HASH | grep '\|' | awk '{print $1}'
    
  • Создайте tarball только из измененных файлов - вы можете отправить вывод вышеуказанного в tar так:

    tar cvzf /tmp/build.tar.gz `git diff --stat $LAST_HASH $CUR_HASH | grep '\|' | awk '{print $1}'`
    

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

Ответ 4

Если тебе это нужно для Дженкинса.

prev_merge=$(git log |grep -C1 Merge | grep commit |head -n1 | awk {'print $2'})
commit=$(git log |head -n 1  | awk {'print $2'})
git diff --name-only $prev_merge $commit

Ответ 5

Может быть, это то, что вы ищете:

git whatchanged origin/master -n 1

Это скажет вам все измененные файлы с момента последней сборки.

Чтобы узнать больше о команде git-whatchanged: https://git-scm.com/docs/git-whatchanged/1.8.3

Кроме того, если вы хотите узнать только изменения предыдущего коммита, измените команду:

git whatchanged -n 1

Надеюсь, это поможет.