[英]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 checkout
或git 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.