git 尊重我初始提交的过滤器分支。git忽略
git filter-branch that respects my initial commits .gitignore
我正在尝试使用 git filter-branch 并让我的初始提交包含 .gitignore(之后重新设置分支)生效。
这就是我运行:
git filter-branch -f --tree-filter 'git rm -r --cached . && git add .' --prune-empty
然而,此命令使存储库保持不变。
为什么?
我也想知道为什么以下命令没有删除存储库中的所有文件:
git filter-branch -f --tree-filter 'git rm -r --cached .'
A --tree-filter
不操作 on/with 索引。1 相反,它将每个提交复制到用作工作树的临时目录,在该临时目录中运行您的命令,并从临时目录中剩余的任何文件中进行新提交 and/or 是新的。您在此过程中对索引本身所做的更改将被有效忽略。
这意味着您必须从工作树中删除新 .gitignore
阻止添加的那些文件。您可以在 --index-filter
中使用 git rm --cached
手动执行此操作,这样会快得多,但是如果您想让 git 在 --tree-filter
中为您完成工作,您可以使用 git 本身使用的相同技巧(参见脚注):使用 git clean
(使用 -x
)清理临时目录。
1这不完全正确:filter-branch
的 --tree-filter
代码在(重新)填充之前使用 git read-tree
填充索引临时目录(这反过来意味着它必须做一些工作来清除以前提交的临时目录,它使用 git clean
)。然后,在 eval
ing 你的过滤器之后,它再次使用索引来检查在临时目录中做了什么。当您 git rm -r --cached .
然后 git add .
时,它会将结果索引(不再包含您忽略的文件)与工作树进行比较,然后... 添加您忽略的文件.啊!
此解决方案有效,但它不支持文件名中的空格:
git filter-branch -f --tree-filter 'ls -r | xargs --no-run-if-empty \
git check-ignore --no-index | xargs --no-run-if-empty rm' --prune-empty
它还会生成非常长的行 git check-ignore
,即工作目录中所有文件的列表(递归)。 git check-ignore
不能自己处理递归吗?以及文件名中的空格,如何支持这些?
我正在尝试使用 git filter-branch 并让我的初始提交包含 .gitignore(之后重新设置分支)生效。
这就是我运行:
git filter-branch -f --tree-filter 'git rm -r --cached . && git add .' --prune-empty
然而,此命令使存储库保持不变。
为什么?
我也想知道为什么以下命令没有删除存储库中的所有文件:
git filter-branch -f --tree-filter 'git rm -r --cached .'
A --tree-filter
不操作 on/with 索引。1 相反,它将每个提交复制到用作工作树的临时目录,在该临时目录中运行您的命令,并从临时目录中剩余的任何文件中进行新提交 and/or 是新的。您在此过程中对索引本身所做的更改将被有效忽略。
这意味着您必须从工作树中删除新 .gitignore
阻止添加的那些文件。您可以在 --index-filter
中使用 git rm --cached
手动执行此操作,这样会快得多,但是如果您想让 git 在 --tree-filter
中为您完成工作,您可以使用 git 本身使用的相同技巧(参见脚注):使用 git clean
(使用 -x
)清理临时目录。
1这不完全正确:filter-branch
的 --tree-filter
代码在(重新)填充之前使用 git read-tree
填充索引临时目录(这反过来意味着它必须做一些工作来清除以前提交的临时目录,它使用 git clean
)。然后,在 eval
ing 你的过滤器之后,它再次使用索引来检查在临时目录中做了什么。当您 git rm -r --cached .
然后 git add .
时,它会将结果索引(不再包含您忽略的文件)与工作树进行比较,然后... 添加您忽略的文件.啊!
此解决方案有效,但它不支持文件名中的空格:
git filter-branch -f --tree-filter 'ls -r | xargs --no-run-if-empty \
git check-ignore --no-index | xargs --no-run-if-empty rm' --prune-empty
它还会生成非常长的行 git check-ignore
,即工作目录中所有文件的列表(递归)。 git check-ignore
不能自己处理递归吗?以及文件名中的空格,如何支持这些?