1

過去数か月間、誤って umask を誤って設定していたのに、どういうわけか気付かなかったのです。

私の git リポジトリの 1 つには、実行可能ファイルとしてマークされた多くのファイルがありますが、これは 644 だけである必要があります。

find -type f -exec chmod 644 {} \;変更を実行してコミットすることで、マスター ブランチのファイルを修正しました。次に、機能ブランチを master にリベースしました。

問題は、そのブランチにのみある機能ブランチに新しく作成されたファイルがあるため、それらは私の大規模な chmod コミットによって修正されませんでした。マスターで行ったコミットと同じことを行う機能ブランチごとに新しいコミットを作成したくありませんでした。そのため、ファイルが作成された各コミットに戻ってアクセス許可を設定するのが最善であると判断しました。

これは私が試したものです:

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がコミットのファイルモードを追跡する理由を本当に理解しているかどうかはまだわかりません。ファイルが最初に作成されたときにファイルのモードを修正したので、他のコミットの1つが明示的に別のものに変更しない限り、そのモードのままになると私は思っていました。そうではないようでした。

これがうまくいくと思った理由は、私の理解から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 に答える