我最近注意到我的文本编辑使用的项目文件(以及其他一些垃圾)都添加了项目的git存储库.由于它们实际上不是项目的一部分,我想删除它们,但git rm不会从存储库中删除旧版本,我找不到任何看起来很有希望的东西.
我一直使用基于接口的git客户端(smartGit),因此对git控制台没有多少经验.
但是,我现在需要在历史记录中替换所有.txt文件中的字符串(因此,不要删除整个文件而只是替换字符串).我找到了以下命令:
git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#xXxXxXxXxXx#g"' -- --all
Run Code Online (Sandbox Code Playgroud)
我试过这个,不幸的是注意到密码确实发生了变化,所有二进制文件都被破坏了.图像等都会被破坏.
有没有更好的方法来做到这一点,不会破坏我的二进制文件?
谢谢.
编辑:
我搞砸了什么.导致二进制文件损坏的实际代码是:
$ git filter-branch --tree-filter "find . -type f -exec sed -i -e 's/originalpassword/newpassword/g' {} \;"
Run Code Online (Sandbox Code Playgroud)
顶部的代码实际上使用我的密码奇怪地删除了所有文件.
git version-control substitution git-filter-branch git-rewrite-history
当我编写代码时,我将其分解为易于查看的简单逻辑更改.
为此,我使用git rebase -i(交互式)来压缩,删除和更改提交顺序.
我注意到这有时会导致GitHub拉取请求的提交顺序不同(尽管订单保留在远程分支上).
例如,
可能会出现在公关中:
我搜索了互联网,但却设法找到了这个GitHub帮助页面:为什么我的提交顺序错误?他们的回答:
如果您通过git rebase或强制推送重写提交历史记录,您可能会注意到打开拉取请求时您的提交顺序无序.
GitHub强调Pull Requests是一个讨论的空间.它的所有方面 - 注释,引用和提交 - 都按时间顺序表示.在执行rebase时重写Git提交历史记录会改变空时连续体,这意味着提交可能无法按照您在GitHub接口中的预期方式表示.
如果您总是希望按顺序查看提交,我们建议您不要使用
git rebase.但是,请放心,当你看到时间顺序以外的东西时,什么都不会破坏!
有办法解决这个问题吗?
请考虑以下问题:
我想做的事:
将所有提交从root用户提交到具有干净状态的任意提交到一个大的"初始提交".
当我做:
git rebase -i --root
Run Code Online (Sandbox Code Playgroud)
并将第一次提交压缩在一起:
pick Initial commit \
fixup dirty1 |
fixup dirty2 | Squash these to one, to remove credentials.
fixup dirty3 |
fixup clean1 /
pick clean2
pick clean3
...
...
Run Code Online (Sandbox Code Playgroud)
我必须重新设置所有内容并在此之后再次解决所有合并冲突.
我怎样才能压缩前N个提交而不必解析整个历史记录,包括N + 1提交后的合并冲突.
你能提供一个(全部或最常见的)操作或命令列表,这些操作或命令会危害git中的历史记录吗?
什么应该绝对避免?
git commit/ git push/ git commit --amend)我希望这个问题(如果它还没有在其他地方之前提出过)成为关于git上常见的可避免操作的某种参考.
此外,我使用git reset了很多,但我还没有完全意识到我可以对存储库(或其他贡献者副本)造成的损害.可能git reset有危险吗?