J'ai cloné un projet qui inclut des .csproj
fichiers. Je n'ai pas besoin que mes csproj
fichiers locaux soient suivis par Git (ou affichés lors de la création d'un correctif), mais ils sont clairement nécessaires dans le projet.
J'ai ajouté *.csproj
à mon LOCAL .gitignore
, mais les fichiers sont déjà dans le repo.
Lorsque je tape git status, cela montre mes modifications csproj
auxquelles je ne suis pas intéressé par le suivi ou la soumission de correctifs.
Comment puis-je supprimer le "suivi" de ces fichiers de mon référentiel personnel (mais les conserver dans la source pour que je puisse les utiliser) afin de ne pas voir les modifications lorsque je fais un statut (ou crée un patch)?
Existe-t-il une manière correcte / canonique de gérer cette situation?
.csproj
fichier, qui est très important pour tout projet. Modifications du.csproj.user
fichier ou de tout autre.Publish.XML
fichier que je ne comprends absolument pas, mais je suis intrigué de savoir pourquoi vous ne voudriez pas suivre le.csproj
...Réponses:
Il suffit de faire appel
git rm --cached
à chacun des fichiers que vous souhaitez supprimer du contrôle de révision. Tant que vos modèles locaux d'ignorance sont corrects, vous ne verrez pas ces fichiers inclus dans la sortie de l'état git.Notez que cette solution supprime les fichiers du référentiel, donc tous les développeurs devraient conserver leurs propres copies locales (non contrôlées par les révisions) du fichier
Pour empêcher git de détecter les changements dans ces fichiers, vous devez également utiliser cette commande:
Ce que vous voulez probablement faire: (ci-dessous @Ryan Taylor réponse )
La réponse complète est ici dans cette URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
la source
git ls-files | xargs git rm --cached
- qui supprimera tout de l'index git dans un répertoire donné sans supprimer les fichiers réels.git rm --cached -r <dir>
fonctionne récursivement sur un dossier et tous les fichiers qu'il contient.Si vous le faites
git update-index --assume-unchanged file.csproj
, git ne vérifiera pas automatiquement les modifications de file.csproj: cela les empêchera d'apparaître dans l'état git chaque fois que vous les modifierez. Ainsi, vous pouvez marquer tous vos fichiers .csproj de cette façon, bien que vous deviez en marquer manuellement tous les nouveaux que le dépôt en amont vous enverra. (Si vous les avez dans votre.gitignore
ou.git/info/exclude
, ceux que vous créez seront ignorés)Je ne suis pas tout à fait sûr de ce que sont les fichiers .csproj ... s'ils correspondent à des configurations IDE (similaires aux fichiers .eclipse et .classpath d'Eclipse), je suggère qu'ils ne devraient tout simplement jamais être contrôlés par la source à tout. D'un autre côté, s'ils font partie du système de construction (comme Makefiles), alors ils devraient clairement --- et un moyen de récupérer les modifications locales facultatives (par exemple à partir d'un local.csproj à la config.mk) serait utile : divise l'accumulation en parties globales et remplacements locaux.
la source
.csproj
?git ls-files -v
affichera les fichiers supposés inchangés avec un indicateur en minuscules (par exempleh
au lieu de d'habitudeH
pour les fichiers mis en cache).Il y a 3 options, vous voulez probablement # 3
1. Cela gardera le fichier local pour vous, mais le supprimera pour toute autre personne quand ils tireront.
git rm --cached <file-name>
ougit rm -r --cached <folder-name>
2. C'est pour l'optimisation, comme un dossier avec un grand nombre de fichiers, par exemple des SDK qui ne changeront probablement jamais. Il dit à git d'arrêter de vérifier cet énorme dossier à chaque fois pour les modifications, localement, car il n'en aura pas. L'
assume-unchanged
index sera réinitialisé et les fichiers seront écrasés s'il y a des modifications en amont du fichier / dossier (lorsque vous tirez).3. C'est pour dire à git que vous voulez votre propre version indépendante du fichier ou du dossier. Par exemple, vous ne voulez pas écraser (ou supprimer) les fichiers de configuration de production / transfert.
Il est important de savoir que
git update-index
cela ne se propagera pas avec git, et chaque utilisateur devra l'exécuter indépendamment.la source
grep
etgit ls-files
it gives me error that your local changes would be overwritten
dans ces 2 fichiers, cela signifie que ce n'est pas un non-suivi, n'est-ce pas?Il s'agit d'un processus en deux étapes:
Supprimez le suivi des fichiers / dossiers - mais conservez-les sur le disque - en utilisant
Maintenant, ils n'apparaissent pas comme "modifiés", mais apparaissent toujours comme
Ajoutez-les à
.gitignore
la source
La réponse acceptée ne fonctionnait toujours pas pour moi
j'ai utilisé
Trouvé la réponse d' ici
la source
Vous avez oublié votre .gitignore?
Si vous avez tout le projet localement mais avez oublié d'ajouter git ignore et que vous suivez maintenant certains fichiers inutiles, utilisez cette commande pour tout supprimer
assurez-vous d'être à la racine du projet.
Ensuite, vous pouvez faire l'habituel
Ajouter
Commettre
Pousser
Conclusion
J'espère que cela aide les personnes qui doivent apporter des modifications à leur
.gitignore
ou tout oublier ensemble.la source
Comme indiqué dans d'autres réponses, la réponse sélectionnée est incorrecte.
La réponse à une autre question suggère que ce pourrait être un saut de travail qui serait nécessaire.
la source
--skip-worktree
est utilisé pour conserver le fichier dans le référentiel mais arrêter de suivre ses modifications . Comme votre réponse le dit: --skip-worktree est utile lorsque vous demandez à git de ne jamais toucher à un fichier spécifique car les développeurs doivent le changer--assume-unchanged
et--skip-worktree
ont un effet similaire, mais leurs objectifs sont entièrement différents. Le premier sert à accélérer les performances de git en trompant git pour ne pas vérifier des fichiers particuliers , tandis que le dernier sert à ignorer les modifications futures sur des fichiers particuliers , qui conviennent à l'exécution mais aux fichiers essentiels.Pour gagner du temps, les règles que vous ajoutez à votre .gitignore peuvent être utilisées pour supprimer plusieurs fichiers / dossiers, c.-à-d.
git rm --cached app/**/*.xml
ou
git rm --cached -r app/widgets/yourfolder/
etc
la source
Pour empêcher la surveillance d'un fichier par git
Et pour revenir en arrière, utilisez
Un référentiel à consulter pour des cas d'utilisation similaires https://github.com/awslabs/git-secrets
la source
Beaucoup de gens vous conseillent d'utiliser
git update-index --assume-unchanged
. En effet, cela peut être une bonne solution, mais seulement à court terme.Ce que vous voulez sans doute faire est la suivante:
git update-index --skip-worktree
.(La troisième option, que vous ne voulez probablement pas, est:.
git rm --cached
Elle conservera votre fichier local, mais sera marquée comme supprimée du référentiel distant.)Différence entre les deux premières options?
assume-unchanged
est de vous permettre temporairement de masquer les modifications d'un fichier. Si vous souhaitez masquer les modifications apportées à un fichier, modifiez le fichier, puis extrayez une autre branche, vous devrez utiliserno-assume-unchanged
puis probablement cacher les modifications effectuées.skip-worktree
vous suivra quelle que soit la succursale que vous passez à la caisse, avec vos modifications!Cas d'utilisation de
assume-unchanged
Il suppose que ce fichier ne doit pas être modifié et vous donne une sortie plus propre lorsque vous le faites
git status
. Mais lorsque vous passez à une autre branche, vous devez réinitialiser l'indicateur et valider ou masquer les modifications avant. Si vous tirez avec cette option activée, vous devrez résoudre les conflits et git ne fusionnera pas automatiquement. En fait, il ne masque que les modifications (git status
ne vous montrera pas les fichiers marqués).J'aime l'utiliser quand je veux seulement arrêter le suivi des modifications pendant un certain temps + valider un tas de fichiers (
git commit -a
) liés à la même modification.Cas d'utilisation de
skip-worktree
Vous avez une classe de configuration contenant des paramètres (par exemple, y compris les mots de passe) que vos amis doivent modifier en fonction de leur configuration.
git update-index --skip-worktree MySetupClass.java
Les modifications que vous effectuez vous suivront quelle que soit la branche. Attention: si vos amis veulent également modifier cette classe, ils doivent avoir la même configuration, sinon leurs modifications seraient poussées vers le référentiel distant. Lors de l'extraction, la version distante du fichier doit remplacer la vôtre.
PS: faites l'un ou l'autre, mais pas les deux car vous aurez des effets secondaires indésirables. Si vous souhaitez essayer un autre indicateur, vous devez d'abord désactiver ce dernier.
la source
Pour dire à Git de ne pas suivre les modifications apportées à votre fichier / dossier local (ce qui signifie que l'état de git ne détectera pas les modifications apportées), procédez comme suit:
Et pour demander à Git de suivre à nouveau les modifications apportées à votre version locale (afin que vous puissiez valider les modifications), procédez comme suit:
la source
réponse d'une ligne
git update-index --assume-unchanged [path]
Utilisez-le chaque fois que vous avez un fichier qui se trouve dans le référentiel central et également un référentiel local. Ce fichier ne doit pas être ajouté
.gitignore
. étant donné que de nouveaux changements dans le fichier sont introduits par les administrateurs système, les développeurs seniors doivent être répartis entre tous les référentiels locaux.Meilleur exemple: fichier de configuration pour les connexions DB . Dans un référentiel central, vous aurez tous les nom d'utilisateur, mot de passe, hôte, port avec les valeurs d'un serveur de base de données de production. Mais dans le développement local, vous devez utiliser uniquement un serveur de développement local ou tout autre serveur de bases de données de développement (que votre équipe a configuré). Dans ce cas, vous souhaitez apporter des modifications au fichier de configuration, mais vous ne devez pas être validé dans le référentiel central.
Meilleur
la source
Je suppose que vous demandez comment supprimer TOUS les fichiers dans un dossier spécifique ou le dossier bin, plutôt que de sélectionner chaque fichier séparément.
Vous pouvez utiliser cette commande:
git rm -r -f /<floder-name>\*
Assurez-vous que vous êtes dans le répertoire parent de ce répertoire.
Cette commande "supprimera" récursivement tous les fichiers qui se trouvent dans les dossiers bin / ou build /. Par le mot supprimer, je veux dire que git prétendra que ces fichiers sont "supprimés" et que ces fichiers ne seront pas suivis. Le git marque vraiment ces fichiers comme étant en mode suppression.
Assurez-vous que votre .gitignore est prêt pour les commits à venir.
Documentation: git rm
la source
Le problème peut être dû à l'ordre de fonctionnement. Si vous avez d'abord modifié le .gitignore, puis git rm --cached xxx, vous devrez peut-être continuer à rencontrer ce problème.
Solution correcte:
Ordre invariant!
Le rechargement du .gitignore après modification!
la source
Je suppose que vous essayez de supprimer un seul fichier de git tacking. pour cela, je recommanderais la commande ci-dessous.
git update-index --assume-unchanged
Ex - git update-index --assume-unchanged .gitignore .idea / compiler.xml
la source
Pour ignorer toute modification de tous les fichiers (d'un certain type) dans un répertoire, j'ai dû combiner certaines de ces approches, sinon les fichiers ont été créés s'ils n'existaient pas auparavant.
Dans la liste ci-dessous, «exclus» est le nom du répertoire dans lequel je souhaite ne pas regarder les modifications.
Tout d'abord, supprimez tous les nouveaux fichiers existants de votre cache de suivi des modifications (sans les supprimer de votre système de fichiers).
Vous pouvez faire de même avec
modified:
.renamed:
est un peu plus compliqué, car vous devrez regarder le->
bit de post pour le nouveau nom de fichier et faire le->
bit de pré comme décritdeleted:
ci-dessous.deleted:
les fichiers s'avèrent un peu plus compliqués, car vous ne semblez pas pouvoir mettre à jour-indexer un fichier qui n'existe pas sur le système localLa dernière commande dans la liste ci-dessus supprimera à nouveau les fichiers de votre système de fichiers, alors n'hésitez pas à l'omettre.
Ensuite, bloquez le suivi des modifications à partir de ce répertoire
la source
Une approche presque sans commande a été donnée dans cette réponse :
Pour ignorer certains fichiers pour chaque dépôt local :
~/.gitignore_global
, par exemple partouch ~/.gitignore_global
dans votre terminal.git config --global core.excludesfile ~/.gitignore_global
pour une fois.~/.gitignore_global
. par exemplemodules/*.H
, qui sera supposé être dans votre répertoire de travail, ie$WORK_DIR/modules/*.H
.Pour ignorer certains fichiers pour un seul dépôt local :
.git/info/exclude
dans le référentiel, c'est-à-dire écrire les chemins de fichier / dir que vous souhaitez ignorer.git/info/exclude
. par exemplemodules/*.C
, qui sera supposé être dans votre répertoire de travail, ie$WORK_DIR/modules/*.C
.la source
Appliquer .gitignore au présent / futur
Si vous devez également purger les fichiers nouvellement ignorés de l'historique de validation de la branche ou si vous ne souhaitez pas que les fichiers nouvellement ignorés soient supprimés des futurs pulls , consultez cette réponse .
la source
après une longue recherche, trouvez un moyen de le faire. alias une commande git dans
.gitconfig
.like dans le projet de studio Android , avant que la branche de paiement ne revienne au fichier de configuration, puis ignorez-le , après que la branche de paiement utilise lesed
fichier de configuration de changement dans ma configuration locale.checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :
la source