簡體   English   中英

如何從 Git 中的未暫存更改中刪除說“舊模式 100755 新模式 100644”的文件?

[英]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-x644 = rw-r--r-- ) - 舊模式包括 +x (可執行)標志,新模式沒有。

此 msysgit 問題的回復建議將 core.filemode 設置為 false 以解決該問題:

git config core.filemode false

core.filemode設置為 false 確實有效,但請確保~/.gitconfig中的設置不會被.git/config中的設置覆蓋。

這通常在 Windows 和 Linux/Unix 機器之間克隆 repo 時發生。

只需告訴 git 忽略文件模式更改。 這里有幾種方法可以做到這一點:

  1. 僅為當前回購配置:

     git config core.filemode false
  2. 全局配置:

     git config --global core.filemode false
  3. 添加〜/ .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

https://stackoverflow.com/a/4408378/450383中的更多詳細信息

您似乎更改了目錄的某些權限。 我做了以下步驟來恢復它。

$  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 遠程倉庫。

  1. 看看你的 repo 的文件權限: git ls-files --stage

  2. 如果 100755 而你想要 100644

然后運行這個命令: git ls-files --stage | sed 's/\t/ /g' | 剪切-d''-f4 | xargs git update-index --chmod=-x

  1. 現在再次檢查你的 repo 的文件權限: git ls-files --stage

  2. 現在提交您的更改:

狀態

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM