![](/img/trans.png)
[英]Git: Remove old mode 100644 new mode 100755 on previous commits
[英]How do I remove files saying "old mode 100755 new mode 100644" from unstaged changes in Git?
出於某種原因,當我最初從存儲庫中提取我的一個 git 項目時,我的工作副本中有大量文件沒有對它們進行可識別的更改,但仍然出現在我的unstaged changes
區域中。
我在 Windows xp 上使用 Git Gui,當我去查看文件以查看發生了什么變化時。 我所看到的是:
old mode 100755
new mode 100644
有誰知道這意味着什么?
如何將這些文件從我的未暫存更改列表中取出? (非常煩人必須瀏覽 100 個文件,只是為了挑選出我最近編輯並想要提交的文件)。
對我來說,這看起來像是 unix 文件權限模式( 755
= rwxr-xr-x
, 644
= rw-r--r--
) - 舊模式包括 +x (可執行)標志,新模式沒有。
此 msysgit 問題的回復建議將 core.filemode 設置為 false 以解決該問題:
git config core.filemode false
將core.filemode
設置為 false 確實有效,但請確保~/.gitconfig
中的設置不會被.git/config
中的設置覆蓋。
這通常在 Windows 和 Linux/Unix 機器之間克隆 repo 時發生。
只需告訴 git 忽略文件模式更改。 這里有幾種方法可以做到這一點:
僅為當前回購配置:
git config core.filemode false
全局配置:
git config --global core.filemode false
添加〜/ .gitconfig:
[core] filemode = false
只需選擇其中之一。
在從舊硬盤復制帶有工作文件的 git repo 幾次時,我遇到了這個問題。 問題源於所有者和權限從舊驅動器/機器更改為新驅動器/機器的事實。 總而言之,運行以下命令來理順事情(感謝這個超級用戶的回答):
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
這對我有用:
git ls-files -m | xargs -L 1 chmod 644
我遇到了同樣的問題。 這救了我的命:
這會將所有權限恢復為差異,因此您將一無所有,但您對文件所做的更改。
https://gist.github.com/jtdp/5443498
git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never \
| git apply
您似乎更改了目錄的某些權限。 我做了以下步驟來恢復它。
$ git diff > backup-diff.txt ### in case you have some other code changes
$ git checkout .
設置git config core.filemode false
的公認答案有效,但有后果。 將core.filemode
設置為 false 告訴 git 忽略文件系統上的任何可執行位更改,因此它不會將其視為更改。 如果您確實需要在將來的任何時間對此存儲庫進行可執行位更改,則必須手動執行此操作,或將core.filemode
設置回 true。
如果所有修改后的文件都應該具有模式 100755,那么一個不太重要的替代方法是執行類似的操作
chmod 100755 $(git ls-files --modified)
它只是完全改變了模式,不多也不少,沒有額外的影響。
(在我的情況下,這是由於 OneDrive 與我在 MacOS 上的文件系統同步;通過不更改core.filemode
,我保留了未來可能再次發生模式更改的可能性;在我的情況下,我會想知道它是否會再次發生,並且更改core.filemode
會將它隱藏起來,我不想要)
此解決方案會將 git 文件權限從 100755 更改為 100644,並將更改推送回 bitbucket 遠程倉庫。
看看你的 repo 的文件權限: git ls-files --stage
如果 100755 而你想要 100644
然后運行這個命令: git ls-files --stage | sed 's/\t/ /g' | 剪切-d''-f4 | xargs git update-index --chmod=-x
現在再次檢查你的 repo 的文件權限: git ls-files --stage
現在提交您的更改:
狀態
git commit -m "恢復了正確的文件權限"
git 推送
您可以嘗試 git reset --hard HEAD 將 repo 重置為預期的默認狀態。
當您拉取並且所有文件在遠程存儲庫中都是可執行的時,就會發生這種情況。 再次使它們可執行將使一切恢復正常。
chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder
您可能需要這樣做:
chmod -x <file> // Removes execute bit
相反,對於未設置為可執行文件並且由於上述操作而更改的文件。 有一種更好的方法可以做到這一點,但這只是一個非常快速和骯臟的修復。
您可以使用以下命令將文件模式更改回來。 git add --chmod=+x -- filename
然后提交到分支。
這就像 bkm 發現的一樣,但它也考慮了所有已刪除的文件,並且在仍然應用更改時只發出警告。
這可以很好地從以前的提交中恢復文件模式設置。
git diff -p --no-ext-diff --no-color --diff-filter=d | grep -E "^(diff|old mode|new mode)" | sed -e "s/^old/NEW/;s/^new/old/;s/^NEW/new/" | git apply
我只有一個權限已更改的麻煩文件。 要單獨回滾,我只是使用rm <file>
手動刪除它,然后進行結帳以提取新副本。
幸運的是我還沒有上演它。
如果我有,我可以在運行git checkout -- <file>
git reset -- <file>
file>
我在將我的分支與 master 進行比較時遇到了這個問題。 當我期望我的分支與 master 相同時,Git 返回了一個“模式”錯誤。 我通過刪除文件然后再次合並主文件來修復。
首先我運行了差異:
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 diff
沒有返回 my-branch 和 master 之間的差異。
如果有任何已刪除的文件,上述許多解決方案都會中斷。
這將列出只修改過的文件,而不是刪除的文件,並將它們全部更改為755
git diff-files --name-only --diff-filter=d | xargs -L 1 chmod 755
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.