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. 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 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-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 des modifications indésirables seront apportées localement et doivent être ignorées afin que les utilisateurs puissent effectuer des extractions.
la source
git ls-files -z
git ls-files -z | xargs -0 git update-index --no-assume-unchanged
, je pense ...git ls-files -z | git update-index -z --stdin
est plus propre.La
find
commande de GNU Findutils a une-exec
option 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 prend chaque argument après
-exec
until;
(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-exec
vous pouvez faire toutes sortes de choses puissantes.Pas sûr des autres implémentations de la
find
commande. YMMV.la source
-exec
est 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.Ajoutez le nom du répertoire à
.git/info/exclude
. Cela fonctionne pour les fichiers non suivis.la source
Oui,
fonctionne uniquement avec des fichiers, pas avec des répertoires. Je pense que l'un des moyens les plus rapides:
la source
cd
, vous pouvez passer le répertoire comme argument final:git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
.