git clean不会在切换分支时删除添加到分支的子模块

Adr*_*ish 28 git

如何切换分支时摆脱子模块.我不明白为什么git clean说它删除了子模块但没有.这是一个错误吗?下面是剪切和粘贴步骤来重现.

git --version
git version 1.7.8.4

git init submod
cd submod
echo "This is a submodule" > README.txt
git add .
git commit -m "Initial commit"
cd ..
git init prog
cd prog
echo "This is a program" > README.txt
git add .
git commit -a -m "Initial commit"
git checkout -b topic1
git submodule add ../submod
git commit -m "Added submodule"

git checkout master
#warning: unable to rmdir submod: Directory not empty
#Switched to branch 'master'

git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)

git clean -fd
#Removing submod/

git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)
Run Code Online (Sandbox Code Playgroud)

sim*_*ont 43

这不是一个错误,它是记录在案的行为.来自man git-clean:

如果未跟踪的目录由不同的git存储库管理,则默认情况下不会删除它.

submod目录是一个不同的git存储库; 如果你想删除它,Use -f option twice if you really want to remove such a directory.

git clean -f -f -d submod 确实删除submod.请参阅下面的步骤(几乎相同;不同的git version和硬编码的submodule路径,因为否则会git吐出假人).


脚步


$ git --version
git version 1.7.5.4 # Note, different git-version. 
Run Code Online (Sandbox Code Playgroud)

制作两个存储库


git init submod
cd submod
echo "This is a submodule" > README.txt
git add .
git commit -m "Initial commit"
cd ..
git init prog
cd prog
echo "This is a program" > README.txt
git add .
git commit -a -m "Initial commit"
Run Code Online (Sandbox Code Playgroud)

添加submod作为git submoduletopic1分支.


git checkout -b topic1
git submodule add /Users/simont/sandbox/SOTESTING/Subdir-testing/submod
git commit -m "Added submodule"
Run Code Online (Sandbox Code Playgroud)

现在为有趣的部分.


$ git checkout master
warning: unable to rmdir submod: Directory not empty
Switched to branch 'master'

git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)
Run Code Online (Sandbox Code Playgroud)

尝试git-clean,那么实际 git-clean.


git clean -fd
#Removing submod/

git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)

$ # As we can see, we haven't actually removed anything yet. 
$ ls
README.txt  submod

$ git clean -f -f -d submod
Removing submod/

$ ls
README.txt

$ git status
# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这样一个事实,即-ff选项在手册页的-d部分中提到,但不在-f部分中... (3认同)
  • 这太棒了!我将它用作“git clean -ffxd”(也删除被忽略的文件)。在某些时候,我可能会在邮件列表中发布有关添加子模块部分的信息(并且可能在错误消息中添加提示)。 (2认同)
  • 这个解决方案起初对我有用.但是当切换回子模块的分支时,它的文件就消失了.所以我不得不再次更新子模块,那时我又回到了同样的问题. (2认同)

jor*_*v92 11

要在签出不同的分支后删除“剩余”子模块,您可以运行以下命令。此命令将递归清理主存储库和所有子模块。 警告:这也将删除所有未跟踪的文件。

git clean -xffd && git submodule foreach --recursive git clean -xffd
Run Code Online (Sandbox Code Playgroud)

要查看哪些文件将被删除而不实际删除,请添加 -n 标志。

git clean -nxffd && git submodule foreach --recursive git clean -nxffd
Run Code Online (Sandbox Code Playgroud)

该命令的关键是传递给 Git clean 的 double-f。否则,Git 将不会删除属于子模块的文件夹(即包含 .git 子文件夹的文件夹)。

  • 请注意,上述建议中的“x”会删除所有“.gitignore”忽略的文件,这可能不是所需的结果。除此之外,它似乎相当有效。 (2认同)