Может ли git зафиксировать "пустые версии" новых непустых файлов?
Может ли git зафиксировать пустые версии некоторых файлов? В данном случае мне нужно, чтобы новые (неотслеживаемые) непустые файлы были сначала добавлены и зафиксированы как пустые файлы, чтобы пометить их содержимое как новые и просмотреть (полный, неотслеживаемый файл добавлять не следует) к индексу; git diff
должен показать вновь добавленное содержимое путем сравнения файла с его подтвержденной пустой версией).
Существует git add -N file…
, который помещает file
с пустым содержимым в указатель, но это только говорит о том, что file
будет добавлено, а git commit
жалуется, что файл не был добавлен. Дело в том, что текущая непустая версия - это не то, что нужно добавить, а только пустая версия нового файла.
Есть ли способ сделать это?
PS: этот вопрос задается в контексте программы, которая автоматически добавляет файлы в репозиторий git (моя программа следует тому, что пишут студенты). Неподтвержденный код - это код, который мне еще предстоит утвердить. Таким образом, состояние, в котором запускается программа, созданная студентом, должно быть пустым, хотя моя программа только что нашла новую непустую программу в их домашнем каталоге; это выполняется путем автоматической фиксации новой пустой версии любого нового файла программы ученика в репозитории git. Таким образом, новые строки кода, которые они пишут, отображаются как вновь добавленное содержимое по сравнению с последней зафиксированной версией git.
Ответы
Ответ 1
Если честно, я не очень понимаю, для чего это полезно. Я бы попытался исправить процесс рецензирования, а не испортить историю. Но если вы действительно хотите это сделать, вот несколько способов:
Прагматичный подход:
mv file out-of-way
touch file
git add file
mv out-of-way file
изящный подход:
git add -N file
git add -p file
... и просто ответьте "нет", когда вас спросят, следует ли добавить один блок. (по-видимому, в 2019 году это больше не работает).
Сантехнический подход:
Сначала убедитесь, что в базе данных объектов существует пустой объект:
git hash-object -w --stdin < /dev/null
Это вернет SHA1 пустого блоба (который является e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
). Вы должны создать этот объект только один раз. Теперь вы можете создавать пустые файлы в индексе с помощью
git update-index --add --cacheinfo 0644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file
Ответ 2
Чтобы ответить на вопрос в заголовке:
Да, git может фиксировать пустые версии новых файлов.
Наиболее распространенный случай - когда вам нужно зафиксировать пустой каталог.
Поскольку фиксация пустых каталогов не поддерживается в git, хитрость заключается в добавлении пустого файла внутрь, обычно называемого .gitkeep
.
Теперь, если вам нужно, чтобы каталог всегда оставался пустым в репо, в .gitignore
вы игнорируете все содержимое каталога, кроме пустого файла.
mkdir uploads
touch uploads/.gitkeep
echo -e '\nuploads/*\n!.gitkeep' >> .gitignore
git add uploads
git commit -m "committing empty uploads directory"
проверьте результат:
$ git show --pretty="" --name-only
uploads/.gitkeep