如果贡献者对Git有autocrlf = true,则修复所有损坏的提交

木通哥

即使只有一行被更改,由于Git CR的自动删除,我的分支的提交也全部损坏。

我们的存储库本身已损坏:它是从SVN转换而未剥离CR的。

因此,任何没有autocrlf = input修复CR / LF的Git客户端都会自动结束。

我修复了一系列可怕的提交,例如(使用core.autocrlf=false和在文件中添加和删除最后一行以使它们有所不同):

git co broken
git co -b fixed HASH_OF_BROKEN
git -c core.autocrlf=false reset --hard

for f in broken.txt; do echo >>$f; unix2dos $f; done

git -c core.autocrlf=false add -u
git -c core.autocrlf=false ci --amend --no-edit

for f in broken.txt; do sed -i '$ d' $f; done

git -c core.autocrlf=false add -u
git -c core.autocrlf=false ci --amend --no-edit

git cherry-pick HASH_OF_NEXT_TO_BROKEN..broken
git push origin fixed

有简单的方法可以解决以下结果:

warning: CRLF will be replaced by LF in ...

如果目标是使存储库具有一致的行尾,那么最好使用重写整个历史记录,而git-filter-branch不是逐个提交地处理它。假设您要使用一致的DOS行尾。

编写一个小程序,该程序可以转换目录树中除之外的所有文件的行尾.git如果您有二进制文件,则还必须跳过它们。这是一个简单的例子。

$ cat ~/bin/all2dos
#!/bin/sh

find . -path ./.git -prune -o -type f -print0 | xargs -0 unix2dos

然后在中使用tree-filter来转换所有历史记录中每次提交的行尾。

$ git filter-branch --tree-filter 'all2dos' -- --all

虽然重写历史记录很可怕,但在一段时间内它是完全可逆的。Git不会重写提交,它会编写新的提交并使用它们。您的原始提交可通过reflog访问,您可以将分支移回它们。

$ git reflog
10eed67 (HEAD -> master) HEAD@{0}: filter-branch: rewrite
e8615e3 HEAD@{1}: commit (initial): Test files

也就是说,最初的提交mastere8615e3,新的重写了10eed67我可以使用移master回原始位置git reset --hard e8615e3

这将导致新的提交ID,因此,当前在您的项目上工作的任何人都可能必须git pull --rebase=preserve进行更新(无论如何,他们都应该这样做),--ignore-cr-at-eol以避免由于换行符更改而引起的冲突。如果他们有任何开放的分支机构,他们将会是旧的master; 他们应该git rebase master以新改写的master分支为基础

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

没有在GitHub上显示为贡献者

如果您不是贡献者/所有者,如何在GitHub的问题上加标签?

如何在Git提交链上查看贡献者的电子邮件地址?

为什么我没有被列为合并我的PR的项目的贡献者?

GitHub API:如何有效地获得每个存储库的总贡献者数量?

最大化具有多个贡献者的唯一集之和的算法

获取已提交到特定文件的贡献者列表

从Github的贡献者列表中删除提交

通过脚本重置RavenDb服务器上所有数据库的所有损坏的索引

显示贡献者的提交次数和贡献的代码行

通过Rest API或客户端DLL创建具有“贡献者”之类的Azure Devops(安全)组

是否可以在所有提交都为贡献者的情况下在Github的个人资料上显示回购协议?

突然拔出电源后如何检查是否有损坏?

“您持有损坏的包装”在尝试安装R时

Git子树-与贡献者共享子树

修复Git中的所有提交消息

我有没有损坏任何组件?

恢复具有损坏的引导扇区的丢失的NTFS分区

git将修复提交给项目所有者

让贡献者分叉私有存储库,但不贡献给主数据库

允许贡献者添加有限数量的节点

如何在分支机构之间的git历史中获取所有贡献者

有没有一种方法可以通过YouTube的API作为贡献者将视频添加到YouTube的播放列表中?

有没有办法在周期中使用断言来查找页面上所有损坏的图像

修复带有损坏工作表的 Excel 文件

带有贡献者的 Dagger 子组件

具有多个 SSH 密钥的多个 github 帐户导致多个贡献者

下载 GitHub 历史记录(提交、消息、分支、贡献者……)

合并前所有列出的贡献者的代码批准