過去数か月間、誤って 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
ます。