Question

sur mon serveur hôte je mon git personnel de projets côté à distance (avec gitosis), et je l'ai construit une interface Web pour parcourir les dépôts (quelque chose comme Github).

Sur le côté éloigné, vous n'êtes pas autorisé à faire beaucoup de choses, parce qu'un arbre de travail est manquant, ce qui est correct: BTW, pour un explorateur référentiel, avec quelques commandes que je peux faire presque tout

À l'exception de blâme git .

Je ne suis pas en mesure de savoir comment blâmer un fichier sans un arbre de travail, dans le dépôt distant côté. Vous avez-vous des idées?

Était-ce utile?

La solution

Ce qui suit devrait fonctionner même dans des dépôts nus:

git blame <rev> -- <path>

par exemple.

git blame master -- README.txt

Autres conseils

  

Je ne suis pas en mesure de trouver où les documents git parlent - l'option, par la façon dont cela fonctionne beaucoup

En fait, cela est nécessaire parce que « git blame » est prêt à prendre une ancien ordre argument bizarre « blame <path> <rev> » en plus de la "blame [<rev>] <path>" habituelle.

Cela signifie que, comme Git 2,17 (Q2 2018) expliquera « git blame HEAD COPYING » dans un dépôt nu n'a pas à courir, tandis que « git blame HEAD -- COPYING » courir très bien.

Mais de 2,17, vous aurez pas besoin '--' plus.

Voir commettras 0c668f5 (5 février 2018) par Junio ??Hamano C (gitster)
(Fusionné par Junio ??Hamano C - gitster - commit 0c668f5 , 7 février 2018)

  

blame: resserrez analyseur en ligne de commande

     

Un ordre ancien argument bizarre « blame <path> <rev> » en plus de la   habituel « blame [<rev>] <path> » a au moins deux négatifs   ramifications:

     
      
  • Pour dire ces deux à part, il vérifie si la dernière commande   Les noms d'argument de ligne un chemin dans l'arbre de travail, à l'aide   file_exists().
      Cependant, « blame <rev> <path> » est une demande de   expliquer chaque ligne dans le contenu de <path> stockés dans   <rev> de révision et n'a pas besoin d'avoir une version d'arbre de travail   du fichier. Une vérification avec file_exists() est tout simplement faux.

  •   
  • Pour contraindre cette vérification erronée de file_exists() au travail, le code   appels setup_work_tree() avant de le faire, parce que le chemin qu'il a   est par rapport au plus haut niveau de l'arborescence du projet.
      Cependant, « blame <rev> <path> » DOIT être utilisable même dans un dépôt nu,   et il n'y a aucune raison de laisser se plaindre setup_work_tree()   et mourir « Cette opération doit être exécutée dans un arbre de travail ».

  •   
     

Pour corriger l'ancien, passez à vérifier si le dernier jeton est   révision (et le cas échéant, les arguments en utilisant parse « blame <path> <rev> »   règle).

     

Corriger cette dernière en se débarrassant de setup_work_tree() et   vérification de file_exists() - le seul cas, l'appel à cette matière de fonction   est quand nous courons « blame <path> » (à savoir aucune révision de départ et   demandant de blâmer le fichier d'arbre de travail à <path>, creuser à travers la   révision de HEAD), mais il y a un appel à setup_scoreboard() juste   avant qu'il appelle fake_working_tree_commit().

Donc en bref, à partir Git 2,17, cela fonctionnera dans un repo nu:

git blame master -- README.txt

Et avec Git 2.22, message d'erreur "This operation must be run in a work tree" doit disparaître!

« git blame -- path » dans un référentiel non-nu commence blâmant de l'arbre de travail, et la même commande dans un dépôt nu des erreurs parce qu'il n'y a pas d'arbre de travail par définition.
La commande a été appris à commencer à blâmer au lieu de la commettras à la HEAD, qui est plus utile.

Voir engagement a544fb0 (7 avril 2019) par Szeder Gábor (szeder)
(Fusionné par Junio ??Hamano C - gitster - commit d8620d3 , 25 avril 2019)

  

blame: par défaut à tête dans un repo nu lorsqu'aucun début coMMIT est donnée

     

Quand « git blame » est invoqué sans spécifier le commettras pour commencer   blâmer de, il commence à partir de l'état du fichier donné dans l'arbre de travail.
  Toutefois, lorsqu'il est invoqué dans un dépôt nu sans commencer à commettre,   alors il n'y a pas d'état de l'arbre de travail à partir, et il meurt avec la   message d'erreur suivant:

$ git rev-parse --is-bare-repository
true
$ git blame file.c
fatal: this operation must be run in a work tree
     

Ceci est trompeur, car il implique que « git blame » ne fonctionne pas   dans des dépôts nus du tout, mais il le fait, en fait, le travail très bien quand   il est donné un commettras de départ.

     

Nous pourrions améliorer le message d'erreur, bien sûr, mais nous allons tout simplement par défaut à tête dans un dépôt nu à la place, comme le plus probable est ce que l'utilisateur voulait de toute façon (s'ils voulaient commencer à partir d'un autre commettras, ils auraient alors précisé que, en premier lieu).

     

« git annotate » est juste une enveloppe mince autour de « git blame », donc dans la   même situation, il a imprimé le même trompeur message d'erreur, et cela   patch corrige aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top