J'ai des modifications locales sur un fichier que je ne veux pas valider dans mon référentiel. C'est un fichier de configuration pour construire l'application sur un serveur, mais je veux construire localement avec des paramètres différents. Naturellement, le fichier apparaît toujours lorsque je fais «git status» comme quelque chose à mettre en scène. Je voudrais cacher ce changement particulier et ne pas le commettre. Je n'apporterai aucune autre modification au fichier.
Après quelques recherches, je vois 2 options: 'assumer-inchangé' et 'sauter-worktree'. Une question précédente ici en parle mais n'explique pas vraiment leurs différences. Ma question est la suivante: en quoi les deux commandes sont-elles différentes? Pourquoi quelqu'un utiliserait-il l'un ou l'autre?
.gitignore
à des fins similaires. Cette solution fonctionnerait-elle pour vous?Réponses:
Tu veux
skip-worktree
.assume-unchanged
est conçu pour les cas où il est coûteux de vérifier si un groupe de fichiers a été modifié; lorsque vous définissez le bit,git
(bien sûr) suppose que les fichiers correspondant à cette partie de l'index n'ont pas été modifiés dans la copie de travail. Cela évite donc un fouillis d'stat
appels. Ce bit est perdu chaque fois que l'entrée du fichier dans l'index change (donc, lorsque le fichier est modifié en amont).skip-worktree
est plus que cela: même s'ilgit
sait que le fichier a été modifié (ou doit être modifié par unreset --hard
ou similaire), il prétendra qu'il ne l'a pas été, en utilisant plutôt la version de l'index. Cela persiste jusqu'à ce que l'index soit supprimé.Il y a un bon résumé des ramifications de cette différence et les cas d'utilisation typiques ici: http://fallengamer.livejournal.com/93321.html .
De cet article:
--assume-unchanged
suppose qu'un développeur ne doit pas modifier un fichier. Cet indicateur est destiné à améliorer les performances des dossiers qui ne changent pas comme les SDK.--skip-worktree
est utile lorsque vous demandez à git de ne jamais toucher à un fichier spécifique car les développeurs doivent le modifier. Par exemple, si le référentiel principal en amont héberge des fichiers de configuration prêts pour la production et que vous ne souhaitez pas accidentellement valider les modifications apportées à ces fichiers,--skip-worktree
c'est exactement ce que vous voulez.la source
--skip-worktree
effets et désactiver le drapeau, il existe une--no-skip-worktree
option. Fonctionne exactement de la même manière. Ceci est utile dans le cas où une main a glissé et que des fichiers incorrects ont été signalés, ou si les circonstances ont changé et que les fichiers précédemment ignorés ne doivent plus être ignorés.--skip-worktree
et le.git/info/exclude
fichier est que le premier fonctionnera même pour les fichiers actuellement suivis..git/info/exclude
, comme.gitignore
, empêchera uniquement l'ajout accidentel de fichiers non suivis à l'index, mais n'apportera pas de modifications aux fichiers déjà suivis.git update-index --skip-worktree <file_name>
Remarque: fallengamer a fait quelques tests en 2011 (ils peuvent donc être obsolètes), et voici ses conclusions :
Les opérations
git pull
:Git conserve de toute façon les modifications locales.
Ainsi, vous ne perdriez pas accidentellement les données que vous avez marquées avec l'un des indicateurs.
assume-unchanged
indicateur: Git n'écraserait pas le fichier local. Au lieu de cela, il produirait des conflits et des conseils sur la façon de les résoudreskip-worktree
indicateur: Git n'écraserait pas le fichier local. Au lieu de cela, il produirait des conflits et des conseils sur la façon de les résoudregit stash
git pull
skip-worktree
assume-unchanged
indicateur: annule toutes les modifications locales sans possibilité de les restaurer. L'effet est comme 'git reset --hard
'. 'git pull
' l'appel réussiraskip-worktree
indicateur: Stash ne fonctionnerait pas sur lesskip-worktree
fichiers. 'git pull
' échouera avec la même erreur que ci-dessus. Le développeur est obligé de réinitialiser manuellement l'skip-worktree
indicateur pour pouvoir cacher et terminer l'échecpull
.git pull
assume-unchanged
assume-unchanged
indicateur: le contenu est mis à jour, l'indicateur est perdu.'
git ls-files -v
' montrerait que l'indicateur est modifié enH
(deh
).skip-worktree
indicateur: le contenu est mis à jour, l'indicateur est conservé.'
git ls-files -v
' afficherait le mêmeS
drapeau qu'avant lepull
.git reset --hard
skip-worktree
assume-unchanged
assume-unchanged
indicateur: le contenu du fichier est rétabli. Le drapeau est réinitialisé àH
(deh
).skip-worktree
indicateur: le contenu du fichier est intact. Le drapeau reste le même.Il ajoute l'analyse suivante:
Il ressemble
skip-worktree
est d' essayer très difficile de conserver vos données locales . Mais cela ne vous empêche pas d'obtenir des modifications en amont si cela est sûr. De plus, git ne réinitialise pas le drapeaupull
.Mais ignorer la
reset --hard
commande ' ' pourrait devenir une mauvaise surprise pour un développeur.Assume-unchanged
l'indicateur pourrait être perdu sur l'pull
opération et les changements locaux à l'intérieur de ces fichiers ne semblent pas être importants pour git.Voir:
Commentaire de Junio (actuel git mainteneur) concernant l'intention de
assume-unchanged
,En particulier, Junio souligne que des modifications de
assume-unchanged
fichiers pourraient être accidentellement validées: "si Git peut déterminer un chemin qui est marqué commeassume-unchanged
ayant changé sans entraîner de coût supplémentaire pour lstat (2), il se réserve le droit de signaler que le chemin a été modifié ( en conséquence,git commit -a
est libre de valider ce changement). "différence entre
assume-unchanged
etskip-worktree
comme discuté dans la liste de diffusion git lors de l'ajout duskip-worktree
patch .Il conclut:
En fait, aucun des drapeaux n'est suffisamment intuitif .
assume-unchanged
suppose qu'un développeur ne doit pas modifier un fichier. Si un fichier a été modifié - alors ce changement n'est pas important. Cet indicateur est destiné à améliorer les performances des dossiers qui ne changent pas comme les SDK.Mais si la promesse est rompue et qu'un fichier est réellement modifié, git rétablit le drapeau pour refléter la réalité. Il est probablement correct d'avoir des indicateurs incohérents dans des dossiers généralement non destinés à être modifiés.
D'un autre côté,
skip-worktree
est utile lorsque vous demandez à git de ne jamais toucher à un fichier spécifique. Cela est utile pour un fichier de configuration déjà suivi.Le référentiel principal en amont héberge une configuration prête pour la production, mais vous souhaitez modifier certains paramètres dans la configuration pour pouvoir effectuer des tests locaux. Et vous ne voulez pas vérifier accidentellement les modifications dans un tel fichier pour affecter la configuration de production. Dans ce cas,
skip-worktree
fait une scène parfaite.Avec Git 2.25.1 (février 2020), le "En fait, aucun des drapeaux n'est suffisamment intuitif" mentionné ci-dessus est clarifié:
Voir commit 7a2dc95 , commit 1b13e90 (22 janvier 2020) par brian m. carlson (
bk2204
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 53a8329 , 30 janvier 2020)( Git Mailing list )
La
git update-index
page de manuel comprend désormais:Cette dernière partie est ce que je décris un pilote de filtre de contenu typique basé sur des scripts smudge / clean .
la source