可能重复:
如何在保留子目录的同时拆分git存储库?
有一次,我将我的代码添加到现有的git repo中,并且已经承诺了很多,因为其他开发人员已经提交到repo中的其他现有文件. 现在我想将我的代码拆分为自己的repo,但保留我的特定文件的所有更改历史记录.
通过阅读其他人为分割代码所做的工作,我正在查看filter-branch和执行--index-filter或--tree-filter使用rm命令来查找我不关心的文件.我不想使用,--subdirectory-filter因为它不适合将我的代码保存为topdir的子目录(我们也共享一个子目录).更复杂的是,原始存储库中的一些文件随着时间的推移已经移动了一些,并且有一些文件被创建然后被删除.这使得设计一个rm列表有点......具有挑战性.
我正在寻找一种方法来过滤所有/除了/文件/目录列表.有人知道这样做的方法吗?
假设我在 git 项目中完成了 5 次提交。
在提交 4 时,我不小心添加了credentials.json 文件并推送到存储库。
在提交 5 时,我删除了该文件并进行了提交,并将此更改推送到存储库。
目前该文件未显示在最新提交中。但是如果用户检查提交历史记录,他可以转到提交 4 并检查我的文件的内容。
如何从提交历史记录中永久删除该文件,以便该文件看起来从未添加到存储库中。
注意:-
我已经尝试过以下命令:-
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch Credentials.json" \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)
它不会引发任何错误,但该文件不会从历史记录中删除。
实际上该文件位于 /src 文件夹内。但奇怪的是,当我给出以下命令(包括完整路径)时:-
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch ~full-path/src/Credentials.json" --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)
我收到错误:- ~full-path/src/Credentials.json 位于存储库外部。
是因为我已经在提交 5 中删除了我的文件吗?在这种情况下我能做什么?
从头开始创建新的存储库是唯一的选择吗?
我想知道是否有人有更高效,更聪明的方式来做到这一点.循环结构要求通过读取每个提交,从每次提交中清除每个已删除的文件.有很多提交,这需要很长时间.
git log --pretty=format: --name-status | grep -i ^D | cut -f2- | sort -u | xargs -I {} git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch {}' HEAD
Run Code Online (Sandbox Code Playgroud)