web-dev-qa-db-fra.com

git update-index --assume-unchanged sur le répertoire

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.

94
Xander Dunn

git update-index veut que les noms de fichier soient sur sa ligne de commande et non sur son entrée standard.

Étape 1:

cd dans le dossier que vous voulez supposer inchangé

Étape 2:

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.

Commandes Windows

Note: Si vous êtes sur Windows, utilisez Git Bash pour exécuter ces commandes

162
twalberg

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.

21
theycallhimart

Ajoutez le nom du répertoire à .git/info/exclude. Cela fonctionne pour les fichiers non suivis.

13
Steve Pitchers

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
2
Victor Perov