GIT - как сохранить файл, общий для всех ветвей

Предположим, что у меня есть файл "ChangeLog" в ветке "master". Я хочу записать информацию обо всех изменениях в любом филиале в этом файле (более подробно, чем в сообщении фиксации и другой описательной информации).

I git checkout -b revA, выполните изменения, обновите ChangeLog и git commit.

I тогда git checkout -b master. Эта проверка заменит ChangeLog версией в ветке "master".

Я бы хотел, чтобы для ChangeLog автоматически была последней версией, независимо от того, какую ветвь я проверил. Я не хочу вручную объединять (или, скорее всего, забывать объединить) ChangeLog из какой-либо другой ветки в мою текущую ветвь.

Я не нашел ничего, что, кажется, позволяет это. Можно ли это сделать?

Ответ 1

Вы можете использовать крюк после проверки:

#!/bin/sh

newref="$2"
isbranch="$3"

# ignore file checkouts
if test $isbranch -eq 0; then
  exit 0
fi

path=ChangeLog

git for-each-ref --sort=-committerdate \
                 --format='%(objectname) %(refname:short)' \
                 refs/heads/\* |
while read sha ref; do
  if git rev-parse --verify --quiet "$sha:$path" >/dev/null
  then
    if test "$newref" != "$sha"; then
      echo Checking out $path from $ref
      git checkout $sha -- "$path"
    fi
    break
  fi
done

По-прежнему вам придется добавлять и фиксировать ChangeLog на вашей ветке, если это необходимо.

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

Ответ 2

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

Если вы разместите достаточное описание в своих сообщениях фиксации, то git log соответствует требованиям. Все изменения, которые находятся в определенной ветки, точно описываются коммитами, которые входят в нее, и невозможно, чтобы она устарела или имела описания изменений, которые ей не приписываются.

С тех пор как я перешел на git, я отказался от ведения журнала изменений вручную. Для меня это не имело никакой ценности и значительных затрат.

Нет причин не помещать полные описания в commits. С помощью --amend вы можете исправить ошибки орфографии и добавить детали, и если вы придерживаетесь соглашения о том, чтобы иметь короткую строку темы и более полное описание, вы можете выбирать между короткими и длинными форматами журнала.

Ответ 3

Поместите его в отдельный репозиторий и используйте submodule, чтобы связать его с каждой ветвью.