git 1.7.12
Je veux marquer tous les fichiers sous un répertoire donné comme supposés-non modifiés.
1) git update-index --assume-unchaged dir/
donne "Chemin ignorant".
2) git update-index --assume-unchaged dir/*
échoue rapidement car il rencontrera des fichiers qui ne font pas l'objet d'un suivi, d'où le message "fatal: Impossible de marquer le fichier" et se ferme.
3) Essayez de générer une liste de fichiers à marquer. cd
dans le répertoire souhaité, puis exécutez git ls-files | tr '\n' ' ' | git update-index --assume-unchanged
. Cela ne produit aucun message d'erreur, mais cela ne marque pas correctement les fichiers. La première partie de la commande, git ls-files | tr '\n' ' '
, produit correctement une liste délimitée par des espaces de tous les fichiers que je veux marquer. Si je copie et colle le résultat de cette commande sur la ligne de commande, alors le git update-index
commande fonctionne. Qu'est-ce qui ne fonctionne pas avec les tuyaux?
Non, il ne me suffit pas d’ajouter dir
à .gitignore. J'ai besoin que ces fichiers soient dans le référentiel, mais les modifications non souhaitées seront effectuées localement et devront être ignorées afin que les utilisateurs puissent effectuer des extractions.
git update-index
veut que les noms de fichier soient sur sa ligne de commande et non sur son entrée standard.
cd
dans le dossier que vous voulez supposer inchangé
Vous pouvez faire soit ceci:
git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')
ou
git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged
Bien que, dans les deux cas, les noms de fichiers avec des espaces seront problématiques. Si vous en avez, vous pouvez utiliser ceci:
git ls-files -z | xargs -0 git update-index --assume-unchanged
Edit: incorpore la contribution de @MatthewScharley concernant git ls-files -z
.
Note: Si vous êtes sur Windows, utilisez Git Bash pour exécuter ces commandes
La commande find
de GNU Findutils a une option -exec
Qui supprime la plupart des problèmes liés à l'utilisation de xargs
, bien que sa syntaxe soit légèrement différente. Il traite cependant parfaitement les noms de fichiers avec des espaces.
Cette commande obligera git à supposer que tous les fichiers situés dans et sous le répertoire indiqué sont inchangés:
find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;
Find prend chaque argument après -exec
Jusqu’à ;
(Que vous devez échapper de peur que votre shell ne le mange) et l’exécute une fois pour chaque fichier trouvé, en remplaçant {}
(À nouveau, simple cité pour que votre Shell ne le mange pas) avec le nom du fichier trouvé.
En utilisant les critères de correspondance de find
(profondeur de récursivité maximale, que la correspondance soit un fichier ou un répertoire, que le nom du fichier corresponde à une expression) et -exec
, Vous pouvez faire toutes sortes de choses puissantes.
Pas sûr des autres implémentations de la commande find
. YMMV.
Ajoutez le nom du répertoire à .git/info/exclude
. Cela fonctionne pour les fichiers non suivis.
Oui,
git update-index --assume-unchanged
fonctionne avec des fichiers uniquement, pas avec des répertoires. Je pense, un des moyens plus rapides:
cd dir
ls | xargs -l git update-index --assume-unchanged