通过更新索引了解git筛选器分支的用法
我一直在尝试破译用于重写索引的通过更新索引了解git筛选器分支的用法,git,git-filter-branch,Git,Git Filter Branch,我一直在尝试破译用于重写索引的git filter branch命令,以便所有repo内容都位于一个新目录中,然后使用该目录将其移动到另一个repo的子目录中。专注于特定的命令: git filter-branch --index-filter ' git ls-files -s | sed "s,\t,&'"$dir"'/," | GIT_INDEX_FILE="$GIT_INDEX_FI
git filter branch
命令,以便所有repo内容都位于一个新目录中,然后使用该目录将其移动到另一个repo的子目录中。专注于特定的命令:
git filter-branch --index-filter '
git ls-files -s |
sed "s,\t,&'"$dir"'/," |
GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' HEAD
这实际上似乎将索引从/folder1/path/to/file
更改为'newrootfolder'/folder1/path/to/file
问题:
变量来自哪里,它设置为什么,以及整行是如何工作的GIT_INDEX_文件
- 如何在存储库中自动创建新文件夹(比如
),git是否在内部检测并创建目录newrootfolder
GIT\u INDEX\u文件是
索引文件的路径(仅限非裸存储库)
该过滤器命令和示例是
这一部分迫使git重新创建一个新的索引文件,其中包含重命名的文件夹
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
创建新索引后,它可以替换旧索引
请注意,当前的选项(在python中,所以跨平台)是使用,它取代了
谢谢,对于这个特定的任务,我需要使用git filter repo--to子目录filter${dir}
。为了完整起见,解释问题中的整个命令是如何工作的也很好,尤其是第二部分。@tangy我同意。我编辑了答案,添加了一些关于旧的git filter分支
命令第二部分的解释。
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
git filter-repo --path <olddirectory>/ --path-rename <olddirectory>/:<newdirectory>/
git filter-repo --path-rename cmds:tools --path-rename src/scripts/:tools/