git update-index --assume-unchanged 对目录
Posted
技术标签:
【中文标题】git update-index --assume-unchanged 对目录【英文标题】:git update-index --assume-unchanged on directory 【发布时间】:2012-08-30 13:44:49 【问题描述】:git 1.7.12
我想将给定目录下的所有文件标记为假定未更改。
git update-index --assume-unchanged dir/
给出“忽略路径”。
git update-index --assume-unchanged dir/*
很快就会失败,因为它会遇到未被跟踪的文件,因此它会给出“致命:无法标记文件”并退出。
尝试生成要标记的文件列表。 cd
进入所需目录,然后运行 git ls-files | tr '\n' ' ' | git update-index --assume-unchanged
。这不会产生错误消息,但不会成功标记文件。命令的第一部分git ls-files | tr '\n' ' '
正确生成了一个空格分隔的列表,其中包含我要标记的所有文件。如果我将该命令的输出复制并粘贴到命令行,则 git update-index
命令有效。管道有什么问题?
不,我将dir
添加到.gitignore 是不够的。我需要将这些文件放在存储库中,但是会在本地进行不需要的更改,这些更改需要被忽略,以便用户可以进行拉取。
【问题讨论】:
你拼错了--assume-unchanged @AdamMudianto 已修复 【参考方案1】:git update-index
想要在其命令行上而不是在其标准输入上的文件名。
第 1 步:
cd
放入你要假设的文件夹不变
第 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 运行这些命令
【讨论】:
仅供参考,那个` | tr '\n' ' '` 位是不必要的。 @twalberg:你可以使用git ls-files -z
@twalberg 如何撤消此命令“git ls-files -z | xargs -0 git update-index --assume-unchanged”
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged
,我想...
git ls-files -z | git update-index -z --stdin
更干净。【参考方案2】:
是的,
git update-index --assume-unchanged
仅适用于文件,不适用于目录。 我认为,一种更快的方法:
cd dir
ls | xargs -l git update-index --assume-unchanged
【讨论】:
不使用cd
,您可以将目录作为最终参数传递:git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
。【参考方案3】:
来自 GNU Findutils 的find
命令有一个-exec
选项,它消除了使用xargs
的大部分麻烦,尽管它的语法有点特殊。但是,它确实可以完美地处理带有空格的文件名。
此命令将使 git 假定列出的目录中和下的所有文件都未更改:
find path/to/dir -type f -exec git update-index --assume-unchanged '' \;
Find 获取-exec
之后直到;
的每个参数(你必须逃避,以免你的shell 吃掉它)并为找到的每个文件运行一次,同时替换 (再次,单引号,所以你的shell 赢了't eat it) 使用找到的文件名。
使用find
的匹配标准(最大递归深度,匹配是文件还是目录,文件名是否匹配表达式)和-exec
,您可以做各种强大的事情。
不确定find
命令的其他实现。 YMMV。
【讨论】:
-exec
is a standard option。你也可以-exec git update-index --assume-unchanged +
(也是标准定义的)一次将多个文件名传递给命令,减少调用git命令的次数。【参考方案4】:
将目录名称添加到.git/info/exclude
。这适用于未跟踪的文件。
【讨论】:
这项工作很棒!你知道这是否也适用于文件吗? 但这不会推送未跟踪的文件 github!有没有什么可能的方法可以从记录中忽略它们,但实际上将它们保存在存储库中!?以上是关于git update-index --assume-unchanged 对目录的主要内容,如果未能解决你的问题,请参考以下文章
git update-index --assume-unchanged忽略跟踪
git update-index --assume-unchanged
自动将“git update-index --chmod=+x”应用于可执行文件
`git update-index --skip-worktree`之后`你对以下文件的本地更改将被checkout覆盖`