Как узнать список всех измененных файлов в 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
Надеюсь, это поможет.