簡體   English   中英

如何從 git 的所有分支中刪除名為.css 的文件

[英]How to remove a file named .css from all branches in git

我正在使用 git 存儲庫,其中包含一個名為.css的文件。 這在 Windows 中簽出時會導致錯誤(但在 Linux 中它工作正常)。

如何從git的所有分支中刪除此文件,而不會意外刪除所有分支中的所有 css 文件?

這是您如何為單個分支執行此操作的方法,因為“所有分支”相當模糊,我將自動化/迭代部分留在所有分支上,讓您按照自己的喜好進行操作(如果您沒有的話,我建議您手動進行許多分支都有這個有問題的文件)

# First checkout the branch - WARNING - Note I use
# --force here to make sure `git status` is clean. 
# I'm relying on it later when doing `git add -A`.
# The --force flag will delete any uncommited local changes,
# so make sure you don't have any of those before running
# the following command
git checkout --force my_branch

# Now delete the `*.css` file. Note the single quotes, they
# are crucial to prevent the shell from doing expansion on the asterisk:
rm -- '*.css'

# Add "all" the changes (The deletion of the file should be the only change):
git add -A

# Now commit
git commit -m 'Removed evil *.css file'

# And push
git push origin my_branch

我沒有故意使用git rm (它結合了刪除和git add在一個命令中添加),因為我無法讓它忽略*作為一個字符,它試圖變得聰明並刪除項目中的所有.css文件。 編輯:有關在 git 命令中指定文字星號的方法,請參閱torek 的答案

如何從 git 中的所有分支中刪除此文件,而不會意外刪除所有分支中的所有 css 文件?

奧馬爾的回答顯示了一種方式; 這是另一個。

注意:您沒有從分支中刪除文件 您正在進行缺少文件的新提交,每個新提交都在某個特定分支上進行。 這是一個重要的區別,因為現有的提交繼續存在,並且繼續擁有該文件。 任何現有的提交都不能更改! 您只需停止使用這些提交。 但只要你還有那些早期的提交,任何試圖在 Windows 上提取其中一個的嘗試都會給你同樣的胃灼熱。 1

要在分支上進行新的提交,我們(當然)會像往常一樣使用git commit 進入某個特定的分支,我們將照常使用git checkoutgit switch 正如 Omer 的回答一樣,重要的是要確保您從一個干凈的設置開始,盡管我不會在這里展示任何特定的方法來保證這一點。

給定一個分支列表,這些分支的文件名稱實際上是*.css ,我們現在需要一個循環,用您喜歡的任何腳本語言編寫。 由於 Git 包含 sh(或 bash),這是一種功能強大的腳本語言,我將在這里使用它:

for name in br1 br2 br3 master; do
    git checkout $name &&
    git rm -f -- ":(literal)*.css" &&
    git commit -m "remove file named *.css" ||
    echo "failed to update branch $name"
done

:(literal)前綴是路徑規范的一部分,可防止git git rm擴展*.css以匹配所有.css文件。 這記錄在gitglossary中,盡管隱藏得相當好。 (The -f flag here allows the git rm even on Windows, though on Windows the git checkout step would probably fail so you'd have to modify the && chain. If you are doing this on a Linux system you don't need the -f標志在這里。)

您可以通過單個git push所有相關分支來跟進此操作:

git push origin br1 br2 br3 master

例如。


1可以在 Git 存儲庫中“重寫歷史記錄”,以便不僅停止使用提交,而且完全停止將其保留在存儲庫中。 這樣做的缺點是每個后續提交的提交編號(hash-ID)也會更改,因此新存儲庫永遠不能與原始存儲庫混合:如果混合在一起,所有舊提交都會立即返回。 有時,但並非總是如此,值得付出努力來實現。 痛苦的程度取決於存在並具有原始提交、預重寫的存儲庫副本的數量和重要性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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