Comment puis-je faire Git d'ignorer mode fichier (chmod) des changements?
J'ai un projet dans lequel je dois changer le mode de fichiers avec chmod
777 pendant le développement, mais qui ne devrait pas changer dans les principaux repo.
Git ramasse sur chmod -R 777 .
et les marques de tous les fichiers modifiés. Est-il un moyen de faire Git d'ignorer les changements de mode qui ont été apportées aux fichiers?
- Ceci est utile lorsque vous travaillez avec git sur Windows + Bash sur Ubuntu que sur Windows
- Pour ceux qui veulent juste pour ignorer les modifications des autorisations pour une invocation de
git diff
, et qui, par conséquent, ne pas vouloir changer leurs Git fichiers de configuration: vous pouvez utilisergit diff -G.
par Zed réponse de ici.
Vous devez vous connecter pour publier un commentaire.
Essayer:
De git-config(1):
La
-c
indicateur peut être utilisé pour définir cette option pour désactiver les commandes:Et la
--global
drapeau de rendre le comportement par défaut pour l'utilisateur connecté.Changements de l'environnement planétaire ne sera pas appliqué pour les référentiels existants. Vous devez cloner le dépôt de nouveau ou d'exécuter
git init
. C'est sûr, sur les référentiels existants. Il ne remplace pas les choses qui sont déjà là.Avertissement
core.fileMode
n'est pas la meilleure pratique et doit être utilisée avec précaution. Ce paramètre ne couvre que le bit d'exécution de la mode et de ne jamais le lire/écrire des bits. Dans de nombreux cas, vous pensez que vous avez besoin de ce paramètre, car vous avez fait quelque chose commechmod -R 777
, de faire de tous vos fichiers exécutables. Mais dans la plupart des projets la plupart des fichiers n'ont pas besoin et ne devrait pas être exécutable pour des raisons de sécurité.La bonne façon de résoudre ce genre de situation est de gérer le dossier et le fichier d'autorisation séparément, avec quelque chose comme:
Si vous le faites, vous n'aurez jamais besoin d'utiliser
core.fileMode
, sauf dans de très rares environnement.git config --global core.filemode false
vous aurez seulement besoin de le faire une fois pour toutes les pensions de titres.git config
commande écrit le réglage pour le bon fichier de config (.git/config
juste le référentiel actuel, ou~/.gitconfig
si utilisé avec--global
).git filter-branch -f --tree-filter 'find * -type f | xargs chmod 644 ' -- --all
git init
pour cette config pour prendre effet.filemode
oufileMode
exactement?find: unknown predicate '-t'
erreur), j'ai dû changer à cela:find . -type d -exec chmod 755 {} \;
etfind . -type f -exec chmod 644 {} \;
chmod +X somefile
est un noop, tandis quechmod +X somedir
va définir le bit d'exécution est sur que dircore.fileMode ... Some filesystems lose the executable bit when a file that is marked as executable is checked out, or checks out an non-executable file with executable bit on. git-clone[1] or git-init[1] probe the filesystem to see if it handles the executable bit correctly and this variable is automatically set as necessary.
A repository, however, may be on a filesystem that handles the filemode correctly, and this variable is set to true when created, but later may be made accessible from another environment that loses the filemode (e.g. exporting ext4 via CIFS mount, visiting a Cygwin created repository with Git for Windows or Eclipse). In such a case it may be necessary to set this variable to false. See git-update-index[1].
core.fileMode
est maintenant explicitement définie dans la par-repo git config sur clone. Doncgit config --global core.filemode false
comme suggéré dans le top commentaire n'aura aucun effet, car il est remplacé par le contexte local.man git-config
.autocrlf
), le git binaire ensemblecore.filemode
localement pour chaque repo sur clone: git-clone ou git-init de la sonde du système de fichiers pour voir si il gère le bit d'exécution correctement et cette variable est automatiquement défini comme nécessaire.annuler le mode de changement dans l'arbre de travail:
Ou dans mingw-git
-d'\n'
partie dexargs
que c'est un argument illégal (et n'est pas nécessaire).tr '\n' '\0'
et ensuite utiliser le-0
arg à xargs à utiliser NUL comme délimiteur.chmod: missing operand after â+xâ
tr
chose a fonctionné! Voici l'intégralité de la commande pour OSX:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
grep --color
aider?Si vous souhaitez définir cette option à tous pour votre repos, utilisez le
--global
option.Si cela ne fonctionne pas, vous êtes probablement à l'aide d'une version plus récente de git donc, essayez la
--add
option.Si vous l'exécuter sans l'option --global et votre répertoire de travail n'est pas un dépôt, vous obtiendrez
--add
, comme dansgit config --add --global core.filemode false
Si
ne fonctionne pas pour vous, faites-le manuellement:
cd dans .git dossier:
éditer le fichier de configuration:
changement de true à false
->
enregistrer, quitter, allez à la partie supérieure du dossier:
reinit le git
vous êtes fait!
.git/config
, une simplegit config core.fileMode false
à la racine de votre projet est assez. Si vous modifiez le fichier de configuration, vous êtes mieux de retrait de la directive entièrement, de sorte que le mondial est ramassé.global
option fait exactement la même chose que de modifier manuellement .git/config~/.gitconfig
, et~/project/.git/config
)git init
devrions-nous définir filemode retour à vrai?Ajoutant à Greg Hewgill répondre (de l'aide
core.fileMode
variable de config):Vous pouvez utiliser
--chmod=(-|+)x
option de git mise à jour de l'index (bas niveau de la version de "git add") pour modifier les autorisations d'exécution dans l'index, d'où il sera ramassé si vous utilisez "git commit" (et pas "git commit-a").Vous pouvez le configurer à l'échelle mondiale:
git config --global core.filemode false
Si le ci-dessus ne fonctionne pas pour vous, la raison pourrait être votre configuration locale remplace la configuration globale.
Supprimer votre configuration locale pour faire de la configuration globale de prise d'effet:
git config --unset core.filemode
Alternativement, vous pouvez changer votre configuration locale à la juste valeur:
git config core.filemode false
git config -l
(liste config actuelle - à la fois local et global)Si vous avez utilisé chmod commande déjà de vérifier ensuite la différence de fichier, Il affiche précédente en mode fichier et le fichier en cours mode de tels que:
nouvelle mode : 755
ancien mode de fonctionnement : 644
définir l'ancienne mode de tous les fichiers en utilisant la commande ci-dessous
sudo chmod 644 .
maintenant jeu de base.fileMode à false dans le fichier de configuration, soit à l'aide de la commande ou manuellement.
appliquer ensuite la commande chmod pour modifier les permissions de tous les fichiers tels que
et à nouveau set de base.fileMode de vrai.
Pour les meilleures pratiques de ne pas Garder de base.fileMode faux toujours.
For best practises don't Keep core.fileMode false always
que voulez-vous dire, vous devez expliquer que.For best practises don't Keep core.fileMode false always.
Certains systèmes de fichiers FAT (par exemple) ne prennent pas en charge les autorisations de fichier, de sorte que le système d'exploitation rapport à une valeur par défaut (766, sur mon système, de toute façon). Dans ce cas,core.filemode
est absolument nécessaire dans les locaux de config, sauf si vous voulez gonfler le commettre l'histoire avec les inutiles et involontaire des modifications des autorisationscore.filemode=false
puis git va ignorer le bit d'exécution des changements, pas besoin de modifier les autorisations. Sauf si vous avez déjà ajouté des modifications des autorisations à l'index, dans lequel cas vous manque l'étape où vous auriez besoin degit add
après désactivation de lacore.filemode
.git config core.fileMode false
. tandis que d'après la définition de ce que certains fichiers ne pourront pas être vu, tel que modifié (ceux qui ont seulement des modifications d'autorisations), mais d'autres avaient d'autres changements au-delà des autorisations d'e.g valide les modifications de code etc seront toujours considérés comme modifiés en raison des modifications de code. Si j'ai commis ces fichiers du mod changement également être commis dans le cadre d'elle?git add
, et les changements que vous voyez lorsque vous exécutezgit status
)Par definining l'alias (dans ~/.gitconfig), vous pouvez facilement désactiver temporairement le fileMode par commande git:
Lorsque cet alias est précédé de la commande git, le fichier changements de mode de ne pas s'afficher avec des commandes qui seraient autrement leur montrer. Par exemple:
Si vous souhaitez définir filemode à faux dans la configuration des fichiers de manière récursive (y compris les submodules) :
find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'
git submodule foreach git config core.fileMode false
Solution Simple:
Hit de ce Simple commande dans le Dossier du projet(il ne supprimera pas les originaux de vos changements) ...il ne supprimer les modifications qui avait été fait alors que vous avez changé projet de dossier d'autorisation
de commande ci-dessous:
git config de base.fileMode faux
Pourquoi ce tous les fichiers inutiles obtenir modifié:
parce que vous avez changé le dossier du projet d'autorisations
avec félicite
sudo chmod -R 777 ./yourProjectFolder
quand allez-vous vérifier les modifications que vous pas fait?
vous avez trouvé comme ci-dessous lors de l'utilisation git diff nom de fichier
Cela fonctionne pour moi:
ou l'inverse, selon votre système d'exploitation