Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过更新索引了解git筛选器分支的用法_Git_Git Filter Branch - Fatal编程技术网

通过更新索引了解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_文件
    变量来自哪里,它设置为什么,以及整行是如何工作的
  • 如何在存储库中自动创建新文件夹(比如
    newrootfolder
    ),git是否在内部检测并创建目录

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/