Может ли git зафиксировать "пустые версии" новых файлов? - PullRequest
15 голосов
/ 20 ноября 2010

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

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

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

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

1 Ответ

32 голосов
/ 20 ноября 2010

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

  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
    

    ... и просто ответьте «нет», когда вас спросят, следует ли добавить один кусок.

  3. Подход к сантехнике:

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

    git hash-object -w --stdin < /dev/null
    

    Это вернет SHA1 пустого большого двоичного объекта (который равен e69de29bb2d1d6434b8b29ae775ad8c2e48c5391).Вы должны создать этот объект только один раз.Теперь вы можете создавать пустые файлы в индексе по

    git update-index --add --cacheinfo 0644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file
    
...