Может ли git зафиксировать "пустые версии" новых непустых файлов?

Может ли git зафиксировать пустые версии некоторых файлов? В данном случае мне нужно, чтобы новые (неотслеживаемые) непустые файлы были сначала добавлены и зафиксированы как пустые файлы, чтобы пометить их содержимое как новые и просмотреть (полный, неотслеживаемый файл добавлять не следует) к индексу; git diff должен показать вновь добавленное содержимое путем сравнения файла с его подтвержденной пустой версией).

Существует git add -N file…, который помещает file с пустым содержимым в указатель, но это только говорит о том, что file будет добавлено, а git commit жалуется, что файл не был добавлен. Дело в том, что текущая непустая версия - это не то, что нужно добавить, а только пустая версия нового файла.

Есть ли способ сделать это?

PS: этот вопрос задается в контексте программы, которая автоматически добавляет файлы в репозиторий git (моя программа следует тому, что пишут студенты). Неподтвержденный код - это код, который мне еще предстоит утвердить. Таким образом, состояние, в котором запускается программа, созданная студентом, должно быть пустым, хотя моя программа только что нашла новую непустую программу в их домашнем каталоге; это выполняется путем автоматической фиксации новой пустой версии любого нового файла программы ученика в репозитории git. Таким образом, новые строки кода, которые они пишут, отображаются как вновь добавленное содержимое по сравнению с последней зафиксированной версией git.

Ответы

Ответ 1

Если честно, я не очень понимаю, для чего это полезно. Я бы попытался исправить процесс рецензирования, а не испортить историю. Но если вы действительно хотите это сделать, вот несколько способов:

  1. Прагматичный подход:

    mv file out-of-way
    touch file
    git add file
    mv out-of-way file
    
  2. изящный подход:

    git add -N file
    git add -p file
    

    ... и просто ответьте "нет", когда вас спросят, следует ли добавить один блок. (по-видимому, в 2019 году это больше не работает).

  3. Сантехнический подход:

    Сначала убедитесь, что в базе данных объектов существует пустой объект:

    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