【问题标题】:How can I add to Git only files with new mode?如何使用新模式添加到仅 Git 文件?
【发布时间】:2019-07-15 13:26:26
【问题描述】:

Git 可以跟踪文件的模式(如 755 或 644)。我对所有工作文件的 chmod 进行了全局更新,但只有其中一些文件的 chmod 错误。现在我有一个混合的更新文件:一些带有我之前更新的新代码,而另一些只有一个新模式。 如何仅将具有新模式的文件添加到 Git?

在 Git 文档中,我找到了 chmod option,但我不确定它是否对我有用。

【问题讨论】:

  • 你可以尝试使用--chmod=+xstackoverflow.com/questions/40978921/…
  • git status 显示什么?
  • 听起来你可以stash,再次运行模式更改命令,提交,然后弹出存储。
  • @wjandrea git status 向我展示了修改后的文件的混合:代码和 chmod。我的问题是如何只为下一次提交添加 chmod 修改过的文件。 git stash 在我的 chmod 更新之前会很棒,但现在为时已晚,所有文件都混合在一起,所以可能存在反向解决方案:git stash only code modified files?
  • @Klemart3D 为时已晚?我说的是存储,再次更改模式,提交,弹出存储。

标签: git chmod


【解决方案1】:

您可以更改所有文件的模式,然后执行git add . 由于 git 只跟踪更改的内容,因此它只会添加那些模式已更改的文件。

请注意,这适用于正确跟踪可执行位的文件系统(git 跟踪的唯一模式)。在 Windows 上,您可能需要使用您链接的 --chmod 选项。

【讨论】:

  • A git add . 添加所有修改过的文件:类似 chmod 的代码。我只想为下一个提交文件添加一个新的 chmod(不是在 chmod 更新之前修改的代码文件)。
  • 检查@wjandrea 对您的问题的评论。您总是可以隐藏您的非模式修改并在模式更改提交后将它们弹出。我希望您没有太多修改过的文件,以至于无法手动存储它们。
  • 我有这么多修改过的文件,我无法从视觉上区分(使用git status)文件代码修改与文件 chmod 修改(并且可能某些文件也有代码 + chmod 修改),就是这样为什么我要问是否存在自动化解决方案:)
【解决方案2】:

除了在某些 Windows 系统上之外,简单的答案就是使用工作树顶层的git add .git add -u。重新添加已经添加的文件是无害的;重新添加现有文件也会选择其新的模式设置。

更多关于索引/暂存区

作为练习,运行以下命令:

git ls-files --stage

在已签出大量文件的现有存储库上。 (这会在大型存储库中打印大量输出,并且默认情况下不使用分页器,因此您可能需要添加 | page| less 或您为分页所做的任何事情。)

这个列表的结果告诉你将在你所做的 next 提交中的所有文件。如果你在这个git ls-files 命令之后运行git commit,你会得到一个新的提交,其中包含git ls-files 列出的文件集,模式信息是--stage 显示的(作为第一列) .

将输出与git status 的输出进行比较:

$ git ls-files --stage | wc -l
    3606

有超过三千六百个文件暂存等待提交!但是:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

为什么这些不同? git ls-files 报告 3606 个暂存文件时,为什么 git status 报告没有暂存文件?

答案是 current 提交——master 的提示——具有相同的 3606 个文件:

$ git ls-tree -r HEAD | wc -l
    3606

此外,HEAD 提交中的 3606 个文件与索引/暂存区域中的 3606 个文件相同(模式、大小和数据字节)。所以git status比较这两个,说它们都没有什么不同,也没有什么可提交的。

如果您更改索引/暂存区域中的一个文件——通过更改工作树中的副本,甚至只是更改模式——暂存区域中仍然会有 3606 个文件,但这一次, 一个会有所不同。 git ls-files 命令将列出所有 3606; git status 命令将列出 不同的 文件。哪些在日常工作中更有用?

索引/暂存区保存每个文件的副本,准备进入下一个提交。这也是模式(总是100755100644)的来源。无论索引/暂存区域中的内容是什么,这就是在您运行 git commit 时提交的内容。您必须运行 git add 的原因是告诉 Git:从工作树副本更新索引副本。

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 2013-10-13
    • 2019-09-22
    • 2020-10-02
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多