1

在过去的几个月里,我不小心把我的 umask 设置不正确,不知何故没有注意到。

我的一个 git 存储库有许多标记为可执行文件的文件,应该只有 644。这个 repo 有一个主 master 分支和大约 4 个私有功能分支(我一直在 master 之上重新建立)。

我通过运行find -type f -exec chmod 644 {} \;和提交更改更正了我的主分支中的文件。然后我将我的功能分支重新定位到 master 上。

问题是功能分支中有新创建的文件仅在该分支中,因此我的大量 chmod 提交没有更正它们。我不想为每个功能分支创建一个与我在 master 上所做的提交相同的事情的新提交。所以我决定最好回到每个提交文件的地方并设置权限。

这是我尝试过的:

git filter-branch -f --tree-filter 'chmod 644 `git show --diff-filter=ACR --pretty="format:" --name-only $GIT_COMMIT`; git add .' master..

看起来这很有效,但经过进一步检查,我注意到在包含具有适当权限 644 的新文件的提交之后的每个提交实际上都会通过以下方式恢复更改:

diff --git a b
old mode 100644
new mode 100755

我一生都无法弄清楚为什么会这样。我想我一定是误解了它的git filter-branch工作原理。

我的解决方案

我已经设法使用以下命令解决了我的问题:

 git filter-branch -f --tree-filter 'FILES="$FILES "`git show --diff-filter=ACMR --pretty="format:" --name-only $GIT_COMMIT`; chmod 644 $FILES; true' development..

我不断添加到FILES变量中,以确保在每次提交中,在某个时间点创建的任何文件都具有正确的模式。

但是,我仍然不确定我是否真的理解为什么 git 会跟踪每次提交的文件模式。尽管我已经在第一次创建文件时修复了文件的模式,因此我认为它会保持该模式,除非我的其他提交中的一个显式将其更改为其他内容。情况似乎并非如此。

我认为这会起作用的原因是我对rebase. 如果我返回HEAD~5并更改一行代码,则该更改会传播,它不仅会更改回HEAD~4.

4

1 回答 1

2

您只是在提交中更改文件的模式,因为您正在生成带有diff. 在最初未更改的提交中,它们将保留原始模式。例如:

git filter-branch --tree-filter 'git ls-files -z | xargs -0 chmod -x' master
于 2012-10-20T09:22:32.473 回答