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覆盖`

取消git忽略文件

git 忽略上传指定文件 命令