Другой подход к идентичным строкам в Git?

Я планирую переход моей компании с CVS на Git, и некоторые инженеры хотят, чтобы мы все еще использовали строки ключевых слов CVS, такие как $Id: $, Я прочитал все о реализации этого с настройкой Ident .gitattributesи я понимаю, почему это нежелательно, хотя, возможно, возможно для небольших исходных деревьев. (Наш источник огромен, поэтому я думаю, что это будет невозможно.)

Наши инженеры не особенно заботятся о том, чтобы в файле был хэш SHA1. Они просто хотят знать:

  1. дата последней модификации
  2. имя коммиттера
  3. возможно сообщение коммита

Им очень удобно видеть эту информацию в заголовках файлов при просмотре кода, и я не могу с этим поспорить.

То, что я хочу знать, это:

Есть ли какой-нибудь способ пометить все поставленные файлы в настоящий момент перед git commit? Другими словами, чтобы запустить команду Perl - это заменяет $Id: $ с блоком нужной информации - о рабочих копиях файлов, которые фиксируются?

Это не потребует каких-либо .gitattributes действия на всех. Git просто нужно знать, как объединить два таких блока информации, в идеале, выбрав последний. Штампованная информация будет просто еще одним изменением файла во вновь созданной версии.

Я смотрел на это в хуке предварительной фиксации, но, похоже, он предназначен по-другому - не для редактирования файлов, а только для их проверки. Я прав в этом?

И никто не пробовал этот подход? Мне кажется это проще, чем пытаться фильтровать все исходные файлы каждый раз, когда git меняет версию, как это звучит .gitattributes делает.

Большое спасибо за любые советы / предупреждения / указатели.

3 ответа

RCS (и, следовательно, CVS) расширяет $Id:$ и такие при оформлении заказа, которые не находятся в сохраненных файлах. И они не могут быть, кто-то может прийти и переименовать версию 1.8.2-rc10 равнине 1.8.2, Если кто-то хочет знать, где file происходит от, git log file отвечает, что приятно, с большим количеством деталей, чем когда-либо мог бы дать RCS. И это локальная команда, без поездки на сервер CVS (и, следовательно, доступна везде, где git есть и мгновенно).

В разделе " Расширение ключевых слов " документации по git объясняется, как сделать чистое расширение ключевых слов.

Рубиновый скрипт для расширения того, что вы хотите, будет примерно таким (не проверено)

#! /usr/bin/env ruby
data = STDIN.read
last_info = `git log --pretty=format:"%ad %cn %s" -1`
puts data.gsub('$Last$', '$Last: ' + last_info.to_s + '$')

фильтр настройки

$ git config filter.last_expander.smudge expand_last_info
$ git config filter.last_expander.clean 'perl -pe "s/\\\$Last[^\\\$]*\\\$/\\\$Last\\\$/"'

настройка.gitattributes

echo '*.txt filter=last_expander' >> .gitattributes

Примечание: (точно так же, как говорит vonbrand), что это дает вам, и что вы, по всей вероятности, хотите, это расширение поля при извлечении и удаление полей при фиксации. Но эффект заключается в том, что ваши инженеры смогут прочитать поля в извлеченных файлах в их рабочем каталоге. Разве это не то, что они хотят? И это не испортит фактически версированный контент с какими-либо избыточными метаданными.

Вот как вы решаете это:

  1. Добавьте следующий хук pre-commit:

    #!/bin/sh
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  2. Добавьте следующий хук commit-msg:

    #!/bin/sh
    awk '!/^[[:space:]]*(#|$)/{exit f++}END{exit !f}' "$1" && exit
    # NOTREACHED unless commit was aborted
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords -d --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  3. Загрузите ".filters/fraubsd-Keywords", но переименуйте файл в "Keywords":

    https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords

  4. Отредактируйте "ключевые слова", изменив их в разделе КОНФИГУРАЦИЯ вверху:

    • FrauBSD в заголовок
    • _FrauBSD для _Header

После чего каждый раз, когда вы делаете git commit текст $Header$ и / или $Header: ... $ будет переведен на $Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

ПРИМЕЧАНИЕ. Возможно, вам придется изменить небольшой раздел сценария "ключевые слова" для работы с более или менее типами файлов. На момент написания этой статьи он работал только с файлами, которые представляют собой "текст ASCII" или "сценарии оболочки".

Другие вопросы по тегам