git update-index --assume-unchanged on directory

git 1.7.12

I want to mark all files below a given directory as assume-unchanged.

  1. git update-index --assume-unchanged dir/ gives "Ignoring path."

  2. git update-index --assume-unchanged dir/* quickly fails because it will encounter files which are not being tracked, hence it gives "fatal: Unable to mark file" and quits.

  3. Try generating a list of files to mark. cd into the desired directory and then run git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. This produces no error message, but it does not successfully mark the files. The first portion of the command, git ls-files | tr '\n' ' ', correctly produces a space delimited list of all the files I want to mark. If I copy and paste the output of that command onto the command-line, then the git update-index command works. What is not working with the pipes?

No, it is not sufficient for me to add dir to .gitignore. I need these files to be in the repository, but undesired changes will be made locally that need to be ignored so that users can do pulls.

62282 次浏览

git update-index希望文件名在其命令行上,而不是在其标准输入上。

Step 1:

进入你想要的文件夹的 cd是不变的

Step 2:

你可以这样做:

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

或者

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

不过,不管是哪种情况,带空格的文件名都会有问题:

git ls-files -z | xargs -0 git update-index --assume-unchanged

编辑:@MatthewScharley 关于 git ls-files -z的合并输入。

Windows 命令

注意: 如果在 windows 上,使用 Git Bash运行这些命令

是的,

git update-index --assume-unchanged

只能用于文件,而不能用于目录。 我认为,更快的方法之一:

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

来自 GNU Findutils 的 find命令有一个 -exec选项,它消除了使用 xargs的大部分麻烦,尽管它的语法有点特殊。然而,它确实能够完美地处理带有空格的文件名。

这个命令会让 git 假设列出的目录中和目录下的所有文件都没有改变:

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

Find 在 -exec之后执行每个参数,直到 ;(您必须转义它,以免您的 shell 吃掉它) ,并对找到的每个文件运行一次,同时用找到的文件名替换 {}(同样,单引号,这样您的 shell 就不会吃掉它)。

使用 find的匹配条件(最大递归深度,匹配是一个文件还是一个目录,文件名是否匹配一个表达式)和 -exec,您可以执行各种强大的操作。

Not sure about other implementations of the find command. YMMV.

Add the directory name to .git/info/exclude. This works for untracked files.