Git chmod の問題: チェックアウトの exec ビットが間違っている

Git chmod の問題: チェックアウトの exec ビットが間違っている

Ubuntu と Debian では、最後にコミットしたファイルに、後でチェックアウトしようとすると実行ビットが設定されます。これは非常に奇妙で、気が狂いそうです。

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

実行ビットがいつ、なぜ挿入されるのか、誰か知っていますか?core.filemodeが に設定されますtrue

ブランチの切り替え中に、vim でファイルを開いておくことが重要な場合もあります。

補遺1:チェックアウトで権限が台無しになっています。ゲームは延々とプレイできます。

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

補遺2:ちなみに、これは、私がコミットしたこのリポジトリ内のすべてのファイルで発生します。コミットが成功した後、権限を間違えずにブランチを切り替えることはできません。

答え1

Git ユーザーではありませんが、Git はファイル権限マスク全体を保存すると考えています。

つまり、ファイルを実行可能ファイルに設定し、Git がそれを取得してリポジトリに複製したことになります。したがって、コミットする前にファイルの権限マスク自体を変更する必要があります。

Gitにそのような変更を無視させるには、

git config core.filemode false

からgit-config(1):

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

答え2

コミットまたはチェックアウト中に実行されるカスタムフックがあるかどうかを確認しましたか?カスタムフックがファイルを改ざんしている可能性があります。githooks マニュアルページ

フックは基本的に、特定のイベント (コミット、チェックアウトなど) で git によって呼び出される小さなプログラムです。

答え3

git commit -m 'mode is 644' ファイルを dev-branch ブランチで試しましたか?

私には、メインの権限を変更し、間違った権限を持つ開発ブランチをプルダウンして、ローカル権限を上書きしているように見えます。その後、再度コミットしようとしています。クローン、変更、コミット、マージのいずれか、または、1つのファイルで個別にファイルを変更して開発にコミットしてからマージしてみてください。

答え4

これらのリンクに良い答えがあります。

https://stackoverflow.com/questions/9027584/github でファイルモードを変更する方法

そして

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

基本的には、変更を加える必要git update-index --chmod=(+|-)x <file>があり、その後、権限を追加/削除するにはコミットしてプッシュする必要があります。

関連情報