Gitのステージングされていない変更から「古いモード100755新しいモード100644」というファイルを削除するにはどうすればよいですか?


723

何らかの理由で、最初に私のgitプロジェクトのリポジトリからプルを行ったとき、作業コピーに大量のファイルがありましたが、それらに識別可能な変更は加えられていませんが、私のunstaged changes領域には表示され続けています。

私はWindows XPでGit Guiを使用しています。ファイルを調べて変更点を確認します。私が見るすべては:

old mode 100755  
new mode 100644  

これが何を意味するのか誰か知っていますか?

ステージングされていない変更のリストからこれらのファイルを取得するにはどうすればよいですか?(私が最近編集してコミットしたいファイルを選ぶためだけに、何百ものファイルを調べなければならないのは非常に不愉快です)。

回答:


1286

これは、UNIXファイルのアクセス許可モードのように見えます(755= rwxr-xr-x644= rw-r--r--)-古いモードには+ x(実行可能)フラグが含まれていましたが、新しいモードには含まれていません。

このmsysgitの問題の返信は、問題を取り除くためにcore.filemodeをfalseに設定することを提案しています:

git config core.filemode false

132
+1。これは、gitがチェックアウトされたファイルに実行可能ビットを正しく設定できると考えているが、そうしようとすると機能しない(または少なくとも読み取りができない)ことを意味します。次に、それらのファイルのステータスを読み戻すと、実行可能ビットが意図的に解除されているように見えます。core.filemodeをfalseに設定すると、ファイルシステム上の実行可能ビットの変更を無視するようにgitに指示されるため、これは変更とは見なされません。実行可能なビット変更をステージングする必要がある場合、手動で行う必要があることを意味しますgit update-index --chmod=(+|-)x <path>
CBベイリー

7
私のように、モードの変更が重要な場合は、core.filemodeをfalseに設定し、実際のコード変更をコミットしてから、core.filemodeをtrueに設定すると、gitがファイルの変更を保持します。
マイケルT.スミス

8
私は同じ問題を抱えていますが、SSH git cmd行を介して同じgit reproを使用し、WindowsのマップされたドライブでGit拡張機能を使用したことが原因でした!。。ソリューションは同じで、 "config" [core] filemode = falseに追加されました
Ian Vaughan

2
それは命の恩人でした、ありがとうございます!これは、私がパブリックフォルダーで複製されたリポジトリを共有し、ファイルのアクセス許可を変更した後、OSXで発生しました。
チアゴガンザローリ

8
@robsch git config --global ...グローバル構成ファイルでオプションを設定するために使用できます。
2015

98

設定core.filemodeをfalseにすると、作業を行いますが、確かでは設定が行い~/.gitconfig、それらの中で上書きされていません.git/config


3
そこに行って、それをやった。悲しいことに、私は問題を自分で解決した後でのみ、あなたのコメントを見つけました。それでも+1!
David Schmitt

1
他のユーザーがこのプロジェクトのクローンを作成している場合は、Windowsを使用している場合、実際に変更を~/.gitconfigファイルに適用するのが最善の方法です。
Ian Vaughan

Windows Powershellで確認したい場合。git config --list --show-origin | sls filemodeまたはLinuxでgit config --list --show-origin | grep filemode。これにより、調整が必要な場所がわかります。
フランク・フー

あなたはそれを釘付けにした!よくやった。
キム

27

古いハードドライブから作業ファイルを含むgitリポジトリを数回コピーしたときに、この問題が発生しました。問題は、所有者と権限が古いドライブ/マシンから新しいドライブ/マシンに変更されたという事実に起因します。長くて短いですが、次のコマンドを実行して問題を修正しますこのスーパーユーザーの回答のおかげ

sudo chmod -R -x . # remove the executable bit from all files

前者のコマンドは実際にgit diffが報告した違いを解決しますが、ディレクトリを一覧表示する機能を取り消すため、でls ./失敗しls: .: Permission deniedます。それを修正するには:

sudo chmod -R +X . # add the executable bit only for directories

悪い知らせは、.shスクリプトなど、実行可能に保ちたいファイルがある場合、それらを元に戻す必要があることです。これは、ファイルごとに次のコマンドで実行できます。

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
ありがとう、たくさん助けてくれました!また、git config core.filemodeがに設定されていることを確認する必要trueがあります。そうしないと、権限の変更が検出されません。また、変更するたびにgitインデックスを更新して取得する必要がありました。
pat-s

影響を受ける依存関係が心配な場合は、このソリューションが最も安全です。
Jin

9

通常、リポジトリがWindowsとLinux / Unixマシン間で複製されたときに発生します。

gitにファイルモードの変更を無視するように指示します。いくつかの方法があります。

  1. 現在のリポジトリのみに設定:

    git config core.filemode false
    
  2. グローバルに設定:

    git config --global core.filemode false
    
  3. 〜/ .gitconfigに追加:

    [core]
         filemode = false
    

それらの1つを選択してください。


(おそらく)gitがこのオプションをtrueに設定してリポジトリを作成するため、グローバル構成は機能しません(Linuxでリポジトリを作成しました)
Herrgott

4

ディレクトリの一部の権限を変更したようです。次の手順で復元しました。

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

git reset --hard HEADを試して、リポジトリを期待されるデフォルトの状態にリセットできます。


8
プルした後、gitが実行可能ビットを正しく/一貫して設定できなかった場合は、リセット後にそれが適切に実行されることはありません。
CBベイリー

2
一部のプロジェクトをusbドライブ(fat32)に移動し、再びubuntuマシン(ext4)に戻したところ、属性が変更された一連のファイルができあがりました。git reset --hard HEAD私には完璧に働きました。ありがとう
cirovladimir 2014年

7
-1。OPは、「最近編集したファイルを取り出してコミットしたい」と述べています。これにより、それらの編集も削除されます。
whitfin 2014年

9
-1 gitでこのコマンドを提案することは、「rm -rf ./を実行するだけで、意図しない結果が生じることはないと確信しています」と言うのと似ています。
Kzqai

1
いいえ、これは役に立ちません。これが問題です。リセットしてクリーンアップしても、gitステータスはモードの変更を示しています。これはWindows gitの深刻な問題であり、ファイルモードを無視して回避するだけでなく、修正する必要があると思います。
vezenkov 2015

2

私は同じ問題に直面しました。そして、これは私の人生を救います:https : //gist.github.com/jtdp/5443498

git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never  \
| git apply`

1

これは、リモートリポジトリでプルし、すべてのファイルが実行可能であった場合に発生します。それらを再度実行可能にすると、すべてが再び通常に戻ります。

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

あなたがする必要があるかもしれません:

chmod -x <file> // Removes execute bit

代わりに、実行可能ファイルとして設定されておらず、上記の操作により変更されたファイルの場合。これを行うにはより良い方法がありますが、これは非常に迅速で汚い修正です。


1

次のコマンドを使用して、ファイルモードを元に戻すことができます。 git add --chmod=+x -- filename 次にブランチにコミットします。


0

アクセス許可が変更された問題のあるファイルが1つだけありました。個別にロールバックするには、手動で削除してrm <file>から、チェックアウトを実行して新しいコピーをプルしました。

幸い、私はまだそれを上演していませんでした。

走るgit reset -- <file>前に走っていたらよかったgit checkout -- <file>


0

ブランチをマスターと比較するときに、この問題に遭遇しました。私のブランチがマスターと同一であると予期したときに、Gitは1つの「モード」エラーを返しました。ファイルを削除してからマスターを再度マージすることで修正しました。

最初に差分を実行しました:

git checkout my-branch
git diff master

これが返されました:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

次に、以下を実行して修正しました。

rm bin/script.sh
git merge -X theirs master

この後、git diffmy-branchとmasterの間に違いはありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.