相关疑难解决方法(0)

将(移动)子目录分离到单独的Git存储库中

我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.

如何在将文件的历史记录保存在子目录中的同时执行此操作?

我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.

为了说清楚,我有以下结构:

XYZ/
    .git/
    XY1/
    ABC/
    XY2/
Run Code Online (Sandbox Code Playgroud)

但我想这样做:

XYZ/
    .git/
    XY1/
    XY2/
ABC/
    .git/
    ABC/
Run Code Online (Sandbox Code Playgroud)

git git-filter-branch git-subtree

1712
推荐指数
15
解决办法
25万
查看次数

我可以在之前的所有提交中更改我的姓名吗?

我想在我的所有提交中更改我的姓名,姓名和电子邮件,这可能吗?

git git-filter-branch

120
推荐指数
4
解决办法
4万
查看次数

你什么时候需要`-tag-name-filter cat`用于`git filter-branch`?

手册页git filter branch说:

use "--tag-name-filter cat" to simply update the tags.
Run Code Online (Sandbox Code Playgroud)

后来甚至说:

use --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

但是--all应该包括--tags,因此所有标签都应该被正确地重写.

一个小测试验证了这一点:

$ git init
$ mkdir dir
$ touch dir/file
$ git add .
$ git commit -am init
$ git ls-files
dir/file
$ git tag tag
$ git for-each-ref
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/heads/master
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/tags/tag
$ git filter-branch --subdirectory-filter dir -- --all
Rewrite 3006eb0a031e40901122ac8984c85ad533982f8b (1/1)
Ref 'refs/heads/master' was rewritten
Ref 'refs/tags/tag' was rewritten
$ git …
Run Code Online (Sandbox Code Playgroud)

git git-filter-branch

18
推荐指数
1
解决办法
7638
查看次数

可以在git filter-branch和rebase之后自动移动标签吗?

编辑问题归结为"也可以git rebase指示重新标记标签吗?" 但对原始问题的回答也会有所帮助.


如何将过去添加到git存储库?我遵循了这些指示.< edit >然后我重新加入以包含仅在快照中的文件,请参见此处.< / edit >由于历史记录被重写(由git filter-branchgit rebase或两者?)所有标签仍然在原始时间线上*我不知何故喜欢将它们移动到新的.我想我用标签做了所有提交消息,所以我可以尝试编写一个使用它们的脚本,但更通用的git move-tags <from> <to>会更好.

那么,有没有办法解决"在新时间轴之后N提交的提交,以便标记旧时间轴上的第N次提交"?除了明显的手动重新定位之外的任何其他解决方案也会很棒.

(请随意将那个可怕的长句纠正为简单的英语......)

*)嘿,git解决了祖父悖论!

tags git history git-rebase git-filter-branch

14
推荐指数
1
解决办法
5357
查看次数

如何在Git历史中替换单词并正确调试相关问题?

我正在尝试从Git历史记录中删除密码等敏感数据.我没有删除整个文件,而只想用密码代替removedSensitiveInfo.这是我在浏览了大量StackOverflow主题和其他网站后想出的.

git filter-branch --tree-filter "find . -type f -exec sed -Ei '' -e 's/(aSecretPassword1|aSecretPassword2|aSecretPassword3)/removedSensitiveInfo/g' {} \;"
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,它似乎正在重写历史记录(它显示了它重写的提交并需要几分钟).但是,当我检查是否确实已删除所有敏感数据时,它仍然存在.

作为参考,这是我如何进行检查

git grep aSecretPassword1 $(git rev-list --all)
Run Code Online (Sandbox Code Playgroud)

这向我展示了与搜索查询匹配的数百个提交.什么都没有被取代.

知道这里发生了什么吗?

我仔细检查了我正在使用的正则表达式,这似乎是正确的.我不知道还有什么可以检查或如何正确调试这个我的Git知识相当简陋.例如,我不知道如何测试1)我的正则表达式是否匹配任何东西,2)sed没有在所有文件上运行,3)文件更改没有被保存,或者4)其他东西.

很感谢任何形式的帮助.

PS我知道有关此主题的几个StackOverflow线程.但是,我找不到一个关于替换所有(ASCII)文件中的单词(而不是删除文件)(而不是指定特定文件或文件类型).不确定这是否应该有所作为,但所有建议的解决方案都不适用于我.

regex git replace sed git-filter-branch

3
推荐指数
1
解决办法
1501
查看次数

如何从标签中永久删除git中的文件?

git filter-branch -f --index-filter 'git rm -r --cached --ignore-unmatch mysql_db' HEAD

这就是我要删除的内容mysql_db,这很好.但现在我必须从我的所有标签中做到这一点.我怎样才能做到这一点?

git

2
推荐指数
1
解决办法
829
查看次数

标签 统计

git ×6

git-filter-branch ×5

git-rebase ×1

git-subtree ×1

history ×1

regex ×1

replace ×1

sed ×1

tags ×1