Как я могу использовать git для размещения только одной строки в файле для коммита, все из скрипта? - PullRequest
10 голосов
/ 06 января 2011

Я пишу простую зацепку git перед фиксацией, которая обновляет год в заголовках авторских прав для файлов, подготовленных для фиксации.

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

Я не вижу никаких опций в руководстве git addпозвольте вам ставить определенные строки.

Я полагаю, я мог бы git stash save --keep-index, применить мое изменение, git add файл, а затем git stash pop, но это кажется довольно грубым.Есть ли лучшие подходы?

Ответы [ 3 ]

2 голосов
/ 06 января 2011

Вот еще одно возможное решение:

  1. Перед запуском сценария изменения авторских прав выполните команду git status, чтобы получить список файлов, которые он собирается зафиксировать. Сохраните список файлов. Выполнить коммит.

  2. Затем сохраните оставшиеся (не связанные) изменения и примените свой скрипт к списку файлов, сохраненных выше. Используйте git commit --amend для изменения предыдущего коммита.

  3. Наконец, нажмите на тайник, чтобы восстановить индекс. Разрешение конфликтов, если необходимо.

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

1 голос
/ 06 января 2011

Если посмотреть на источник git add --interactive, то похоже, что он изменяет индекс с помощью git apply --cached Предполагая, что ваше авторское право является первым элементом любой разницы, внесите изменения и используйте:

git diff -- file | 
awk 'second && /^@@/ {exit} /^@@/ {second=1} {print}' |
git apply --cached

Где эта вторая строка (скрипт awk захватывает только первый блок различий). Вы также можете создать вывод diff вручную или использовать другие правила для выбора блока.

1 голос
/ 06 января 2011

Вы можете установить исправленную версию файла на отдельном шаге, например,

blobid=$(git show :"$filepath" | copyright-filter | git hash-object -w --stdin)

if $? -eq 0; then

    git update-index --cacheinfo 100644 "$blobid" "$filepath" &&
    copyright-filter "$filepath"

fi

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...