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.

Xander Dunn
la source

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

Twalberg
la source
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.

ils appellent
la source
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.

Steve Pitchers
la source
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
Victor Perov
la source
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