git - 如何通过将父文件添加到存储库并保留历史记录将存储库移动到父文件夹
问题描述
我有一个多分支存储库foo/src
,但是我想在保留历史记录并将所有这些文件添加到整个历史记录的同时向上移动存储库(.git 成为 src 的邻居)。
--- foo/
|-bar/
|-src/
|-.git
|-hello.txt
我怎样才能做到这一点 ?
注意:我已经尝试过这个答案,但无法将文件添加到整个回购历史记录中。然后我尝试了rebase -i --root
(here),但这仅适用于一个分支,损坏并过时了其余的分支。
解决方案
开始之前:备份您的 git 存储库,因为该filter-branch
命令具有破坏性!
您可以使用git filter-branch
该--tree-filter
选项。选项手册--tree-filter
指出:
这是用于重写树及其内容的过滤器。该参数在 shell 中进行评估,工作目录设置为签出树的根目录。然后按原样使用新树(自动添加新文件,自动删除消失的文件 - .gitignore 文件和任何其他忽略规则都没有任何效果!)。
因此,对于每个提交,我们都希望创建一个新目录src
并将树中的所有文件移动到它(src/
当然不包括它自己)。
git filter-branch --tree-filter '
mkdir -p src
for i in *; do
if [ "$i" != "src" ]; then
mv "$i" src/
fi
done
' --all
之后,您可以添加未跟踪的bar/
目录并hello.txt
在顶部添加新的提交。
如果您希望bar/
并且hello.txt
从历史记录开始就出现在 repo 中,则必须稍微调整 tree filter 命令。
git filter-branch --tree-filter '
mkdir -p src
for i in *; do
if [ "$i" != "src" ]; then
mv "$i" src/
fi
done
cp -R "/path/to/bar" .
cp "/path/to/hello.txt" .
' --all
推荐阅读
- kubernetes - 我可以使用 Cloud Router 从本地访问私有 GKE 主端点吗?
- java - 导入 JavaFX 包以通过命令行/CMD 运行
- python - Scrapy 下载特定类型的文件
- node.js - Neo4j NodeJS 代码不显示整个节点数据
- selenium - 如何单击遇到 TimeoutException 和 NoSuchElementException 错误的 href?
- javascript - 在倒数第二个索引之后删除其余字符串
- sql - SQL:识别事件是否发生?
- javascript - Companies House API jquery ajax 返回 401
- node.js - 尝试根据nodejs中的另一个集合对象从集合中获取对象
- python - 基于字典在数据框中搜索字符串