Comment extraire un fichier d'un autre commit dans Magit

16

J'ai un fichier foo.txtdans la branche Aet je veux extraire foo.txtde la branche Bdans l'index. Sur la ligne de commande, je ferais ceci:

$ git checkout B -- foo.txt

Je veux pouvoir le faire dans magit en allant dans le journal, en trouvant le commit qui m'intéresse (par exemple l o B), en trouvant foo.txtet en exécutant une commande, mais je ne sais pas comment le faire.

Emoses
la source
Il s'agit maintenant d'une demande de fonctionnalité github.com/magit/magit/issues/2184 . Merci de l'avoir regardé, mainteneurs
Emoses

Réponses:

21

Depuis magit 2.11.0, cela est possible directement depuis le répartiteur de réinitialisation ( X fet vous pouvez spécifier la révision et le fichier):

entrez la description de l'image ici

Cela peut être fait par programmation dans magit using magit-file-checkoutqui accepte une spécification de version et le nom de fichier (grâce à la demande de fonctionnalité de @Emoses et à l'implémentation de @Kyle Meyer). Auparavant, la fonction était nommée magit-checkout-file(de la v2.3.0 à la v2.9.0).

ebpa
la source
4
magit-checkout-fileest désormais obsolète. Utilisez magit-file-checkoutplutôt.
Sagar Jha
3

Je ne connais pas de méthode intégrée pour le faire.

En supposant que vous êtes sur la branche A, une autre approche serait de différencier la branche B ( d r ..B), puis de déplacer le point vers le fichier qui vous intéresse. Appuyez sur apour appliquer ces modifications à l'arborescence de travail (plutôt qu'à l'index).

J'ai une commande dans ma configuration pour réinitialiser ou extraire un fichier d'une révision, mais, dans son état actuel, elle ne correspond pas exactement à ce que vous demandez car elle n'offrira pas une bonne révision par défaut lorsque dans Magit Revision mode.

(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)))
Kyle Meyer
la source