2010-11-20 4 views
13

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

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

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

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

+1

честно, я не понимаю вашу проблему. 'touch empty-file && git add empty-file && git commit' работает для меня. – joschi

+0

'git diff' отлично работает для вновь созданного файла. Если вы различаете состояние, когда файл не существует с diff, когда он имеет контент, вы увидите все добавленные строки, то же самое различие, что и у пустого файла. (Только моделирование отличается.) – Cascabel

+1

@joschi: Проблема в том, что у меня много новых, * непустых * файлов. Использование подхода Свена №1 более громоздко, поскольку он использует свой аккуратный подход к водопроводу. – EOL

ответ

29

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

  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 
    
+0

@Sven: Большое вам спасибо ! Подход для сантехники идеально подходит для меня: его легко автоматизировать и до такой степени (второе предположение, почему мне это нужно, не так важно, хотя :)). Это полезно для того, чтобы следить за тем, какой новый код мои ученики добавляют в свой домашний каталог, используя 'git diff' на моих локальных копиях своих программ. Код, который я еще не одобрил, не должен быть зафиксирован, но продолжайте появляться как новые добавленные строки (по сравнению с пустым файлом), если он не был выполнен (то есть одобрен). – EOL

+0

@EOL: Вы также можете легко автоматизировать touch, add, * then * copy. – Cascabel

+0

@EOL: Извините за звучание недоброго - просто хотел указать, что я не рекомендую делать то, что я объяснил в этом ответе. Я думаю, что подходы, которые Джефоми предлагает в комментариях к вашему вопросу, обеспечивают более гибкие (и более надежные) рабочие процессы. –