Comment «le blâme git sur le dépôt distant côté?
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?
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 commandeUn 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 avecfile_exists()
est tout simplement faux.Pour contraindre cette vérification erronée de
file_exists()
au travail, le code appelssetup_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 plaindresetup_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 defile_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 deHEAD
), mais il y a un appel àsetup_scoreboard()
juste avant qu'il appellefake_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éeQuand «
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.