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


101

git 1.7.12

Je veux marquer tous les fichiers sous un répertoire donné comme supposés inchangés.

1) git update-index --assume-unchaged dir/donne «Ignorer le chemin».

2) git update-index --assume-unchaged dir/*échoue rapidement car il rencontrera des fichiers qui ne sont pas suivis, d'où il donne "fatal: Impossible de marquer le fichier" et se ferme.

3) Essayez de générer une liste de fichiers à marquer. cddans 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 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 souhaite marquer. Si je copie et colle la sortie de cette commande sur la ligne de commande, la git update-indexcommande 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 des modifications indésirables seront apportées localement et doivent être ignorées afin que les utilisateurs puissent effectuer des extractions.

Réponses:


174

git update-index veut les noms de fichiers sur sa ligne de commande, pas sur son entrée standard.

Étape 1:

cd dans le dossier que vous voulez supposer qu'il est inchangé

Étape 2:

Vous pouvez faire ceci:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

ou

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Cependant, 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: entrée intégrée de @MatthewScharley concernant git ls-files -z.

Commandes Windows

Remarque: si vous êtes sous Windows, utilisez Git Bash pour exécuter ces commandes


2
FYI, que «| tr '\ n' '' `bit est inutile.
Václav Slavík

7
@twalberg: Vous pouvez simplement utilisergit ls-files -z
Matthew Scharley

2
@twalberg Comment annuler cette commande "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Mohamed Hussain

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, je pense ...
twalberg

1
git ls-files -z | git update-index -z --stdinest plus propre.
Jed

22

La findcommande de GNU Findutils a une -execoption qui supprime la plupart des tracas liés à l'utilisationxargs , bien que sa syntaxe soit un peu spéciale. Il traite cependant parfaitement les noms de fichiers avec des espaces.

Cette commande permettra à git de supposer que tous les fichiers dans et sous le répertoire répertorié sont inchangés:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find prend chaque argument après -execuntil ;(dont vous devez échapper pour que votre shell ne le mange pas) et l'exécute une fois pour chaque fichier trouvé, en remplaçant{} (encore une fois, entre guillemets simples pour que votre shell ne le mange pas) par le nom du fichier trouvé.

En utilisant find les critères de correspondance (profondeur maximale de récursivité, si la correspondance est un fichier ou un répertoire, si le nom de fichier correspond à une expression) et -execvous pouvez faire toutes sortes de choses puissantes.

Pas sûr des autres implémentations de la findcommande. YMMV.


2
-execest une option standard . Vous pouvez également -exec git update-index --assume-unchanged {} +(également défini par la norme) qui transmet plusieurs noms de fichiers à la commande à la fois, réduisant le nombre de fois où la commande git est appelée.
Tom Fenech

16

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


Ce travail très bien! Saviez-vous si cela fonctionne aussi avec les fichiers?
betomoretti

Mais cela ne pousse pas les fichiers non suivis github! y a-t-il un moyen possible de simplement les ignorer des enregistrements mais de les conserver dans les dépôts !?
Mahmoud Zalt

2

Oui,

git update-index --assume-unchanged

fonctionne uniquement avec des fichiers, pas avec des répertoires. Je pense que l'un des moyens les plus rapides:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
Au lieu d'utiliser cd, vous pouvez passer le répertoire comme argument final: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.