Как тиражировать git-checkout, используя только сантехнические команды?

Я хотел бы избежать вызова фарфоровых команд из моих сценариев, но есть ли способ получить некоторые из поведения git checkout <commit> используя только сантехнические команды, такие как checkout-index? Меня особенно интересует влияние на рабочую копию: при условии, что все чисто, checkout удаляет файлы, которые были отслежены в старом HEAD и отсутствуют в новом. checkout-index Похоже, что нет концепции удаления файлов. Самое близкое, что я могу придумать, это позвонить

git diff-tree -p <old> <new> | git apply

но вычисление всего различий кажется излишне дорогим. Есть ли способ лучше?

1 ответ

Решение

Вы ищете два дереваgit read-tree -um, Он использует базовое дерево, (как правило, вы кормите его HEAD), целевое дерево и (неявно) индекс и рабочее дерево. Таблицу, описывающую ее поведение, было трудно понять, поэтому у меня есть собственная таблица для нее, переформатированная, которая в любом случае имеет для меня больший смысл. Во всяком случае, он реализует git checkout,

git read-tree -um H M  # `I` is the (implicit) index, GIT_INDEX_FILE

                    Legend

        H       Original tree (usually HEAD:)
        I       Indexed tree
        M       Merge target tree

        H->I     \
        H->M      } status in second relative to first
        I->M     /

        "-"     file exists in neither
       new      exists only in second
       deleted  exists only in first
       same     exists in both, unchanged
       changed  exists in both, different
      (blank)   irrelevant or all cases not otherwise given

        keep    keep current version
        fail    whole command fails, no changes
       delete   delete worktree file


      H->I      H->M      I->M

                          same     keep

     deleted   changed             fail
     deleted   deleted             delete
     deleted    same               delete unless Index empty, else use M
                same               keep

      same     changed             worktree clean: use M; dirty: fail
      same     deleted             worktree clean: deleted; dirty: fail

      new        -                 keep
      new       new      changed   fail
     changed   changed   changed   fail
     changed   deleted             fail


note: "index empty" identifies an initial checkout, where HEAD has been
set but never loaded.  git can't currently distinguish between a
delete-everything index and an initial-checkout index.
Другие вопросы по тегам