Как извлечь файл из другого коммита в Magit


16

У меня есть файл foo.txtв ветке A, и я хочу извлечь foo.txtиз ветви Bв индекс. В командной строке я бы сделал это:

$ git checkout B -- foo.txt

Я хочу быть в состоянии сделать это в magit, войдя в систему, найдя коммит, в котором я заинтересован (например l o B), найдя foo.txtи выполнив некоторую команду, но я не могу понять, как это сделать.


Теперь это запрос функции github.com/magit/magit/issues/2184 . Спасибо за просмотр, сопровождающие
Emoses

Ответы:


21

Начиная с magit 2.11.0 это возможно непосредственно из диспетчера сброса ( X fи вы можете указать ревизию и файл):

введите описание изображения здесь

Это может быть сделано программно в magit, используя magit-file-checkoutкоторый принимает спецификацию версии и имя файла (благодаря запросу функции @Emoses и реализации @Kyle Meyer). Ранее функция была названа magit-checkout-file(от v2.3.0 до v2.9.0).


4
magit-checkout-fileсейчас устарел. Используйте magit-file-checkoutвместо этого.
Сагар Джа

3

Я не знаю встроенного способа сделать это.

Предполагая, что вы находитесь на ветви A, другой подход будет заключаться в том, чтобы изменить ветку B ( d r ..B), а затем переместить точку в файл, который вас интересует. Нажатие aприменяет эти изменения к рабочему дереву (а не к индексу).

У меня есть команда в моей конфигурации для сброса или извлечения файла из ревизии, но в его текущем состоянии он не соответствует именно тому, что вы запрашиваете, потому что он не будет предлагать хорошую ревизию по умолчанию, когда в Magit Revision Режим.

(defun km/magit-reset-file (rev file &optional checkout)
  "Reset FILE from revision REV.

If prefix argument CHECKOUT is non-nil, checkout FILE from REV
instead.

\(git reset REV -- FILE)
\(git checkout REV -- FILE)"
  (interactive
   (let ((rev (magit-read-branch-or-commit "Revision")))
     (list rev (magit-read-file-from-rev rev "File") current-prefix-arg)))
  (magit-with-toplevel
    (magit-run-git (if checkout "checkout" "reset")
                   rev "--" file)))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.