自动重新调整整个存储库的基础以重组和应用 Prettier

2024-02-20

我想清理一个具有一年提交量(总共大约 4000 次)的存储库的历史记录。

  • 一位贡献者一直不同意格式化标准,并多次更改 Prettier 配置文件,或者根本不使用 Prettier。结果,git 的历史就像一场外观变化的拉锯战,差异巨大,而真正的变化很难找到。

  • 前端目录的名称在某个时候被重命名。我们从该目录中加载项目,这使得从 VSCode 访问早期的 git 历史记录变得很麻烦。

  • 在某个时候添加了 TypeScript 转译器,生成file.js and file.js.map对于每一个file.ts整个项目。这些文件生成的不一致(有时它们末尾有特定的注释,有时没有),这增加了 git 历史记录中的噪音。

我的暂定计划是重新调整一切:

我将保留存储库的备份以防万一,然后重新设置基准,在每次提交时执行以下操作:

  • 应用一致的 Prettier 设置;
  • 如有必要,重命名前端目录;
  • 删除所有不需要的file.js and file.js.map files.

然后我们的团队将转移到新的存储库。

具体来说:

GIT_SEQUENCE_EDIT=cat git rebase
  --strategy recursive --strategy-option theirs --rebase-merges \
  --exec '../cleanup.sh && git add . && git commit --amend --no-edit --no-verify --allow-empty' \
  e709bcd1

where e709bcd1是一个很好的起点,使用脚本cleanup.sh:

#! /usr/bin/env zsh
setopt nullglob

echo $(git rev-parse HEAD) > commit.log

# If both directories exist, assume old_front_end is the real one,
# so delete new_front_end to allow us to rename old_front_end.
# (Otherwise, `mv` will move the one directory into the other.)
if [[ -d "old_front_end" ]] && [[ -d "new_front_end" ]]; then
  rm -rf new_front_end
fi

# Rename old_front_end if necessary
if [[ -d "old_front_end" ]] && [[ ! -d "new_front_end" ]]; then
  mv old_front_end new_front_end
fi

if [[ -d "new_front_end" ]]; then
  # Clean up JS files
  for file in "new_front_end/src/**/*.ts"; do
    [[ ! -e $file ]] && continue  # skip following if no such file
    rm "${file%.*}.js"
    rm "${file%.*}.js.map"
  done

  # Apply consistent Prettier settings
  prettier --config ~/external_source_of_truth/.prettierrc -w "new_front_end/src/**/*.{js,ts,svelte,gql,css,scss}" || true
fi

问题:

  • 我没有太多变基或编写 shell 脚本的经验。这是一个合理的计划吗?会带来不幸的后果吗?
  • 我尝试运行该脚本,但它经常因合并冲突而卡住。看来我总是可以通过这样做来解决冲突git add . && git rebase --continue,但我不想这样做数百次。我可以自动化这个吗?

我使用解决了这个问题git filter-repo以及相关工具lint-history:

重命名前端目录:

git filter-repo --path-rename old_front_end/:new_front_end/

清理JS文件:

git filter-repo --force --filename-callback '
  if filename.endswith(b".js"):
    ts_file = filename[:-3] + b".ts"
    if os.path.isfile(ts_file.decode("utf-8")):
      return None

  if filename.endswith(b".js.map"):
    ts_file = filename[:-7] + b".ts"
    if os.path.isfile(ts_file.decode("utf-8")):
      return None
    
  return filename
'

Prettier

lint-history --relevant '
  return filename.endswith(b".ts") or filename.endswith(b".js")
         or filename.endswith(b".svelte") or filename.endswith(b".css")
         or filename.endswith(b".scss") or filename.endswith(b".gql")
  ' --filenames-important maybe-prettier

我需要编写一个名为的帮助程序脚本maybe-prettier因为某些提交有带有未解析的合并符号的错误文件(<<<<<<<< HEAD等等)。 Prettier 无法格式化这些文件并因错误退出,从而停止了进程filter-repo。为了解决这个问题,maybe-prettier首先检查文件是否能够格式化;它总是成功退出。

也许更漂亮

#! /usr/bin/env zsh

# Prettier gives three exit codes:
#  0 file is good
#  1 needs formatting
#  2 error
prettier --config ~/external_source_of_truth/.prettierrc -c $1
if [[ $? = 1 ]]; then
  prettier --config ~/external_source_of_truth/.prettierrc -w $1
fi
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动重新调整整个存储库的基础以重组和应用 Prettier 的相关文章

  • 当 .gitattributes 中的 EOL 设置为 CRLF 时,Git diff 认为行结尾为 LF

    当我恢复对带有 Windows 行结尾的文件的更改并且 gitattributes 将 EOL 定义为 CRLF 时 git 认为行结尾已更改为 LR 即使十六进制编辑器显示 CRLF 仅当 gitattributes 定义 EOL 字符时
  • 当当前分支上有未提交的更改时签出另一个分支

    大多数时候 当我尝试签出另一个现有分支时 如果我在当前分支上有一些未提交的更改 Git 会不允许我这样做 所以我必须首先提交或隐藏这些更改 然而 有时 Git 确实允许我在不提交或存储这些更改的情况下签出另一个分支 并且它会将这些更改携带到
  • 将bitbucket发布到数字海洋

    我本质上是试图使用 bitbucket 来理解 git 的概念 我一直在通过修改本地帐户和 bitbucket 帐户之间的文件来练习版本控制 事实证明这很有帮助 现在我正在尝试弄清楚如何将文件从 bitbucket 或者我猜是 GitHub
  • 无法通过 Git Bash 克隆 git 存储库

    在尝试使用克隆存储库时git clone 它显示以下错误 致命 无法访问 https github com microsoft c9 python getting started git https github com microsoft
  • 为什么 Git 无法将文件更改与修改后的父级/主控合并?

    我有一个文件 里面只有一行 我创建一个分支并向同一文件添加第二行 保存并提交到分支 我切换回主人 并向文件中添加不同的第二行 保存并提交给master 现在总共有 3 条独特的线路 如果我现在尝试将分支合并回主分支 则会遇到合并冲突 为什么
  • 如何减少 Bitbucket 上的 git repo 大小?

    我的问题摘要 在我向两个现有文件添加了几百个字节后 我在 Bitbucket 上的一个私人存储库的大小突然增加了一倍多 该存储库现在超过 2GB 这导致 Bitbucket 将其置于只读模式 因为它处于只读模式 所以我无法推送会减少存储库大
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Git 的企业采用率?

    最近一些同事之间进行了一场讨论 在当今的软件行业中 如何存在两个不同的世界 面向自由软件 公司的 Question Git 在企业环境中的使用情况如何 您在企业环境中使用 Git 的体验如何 无论如何 我们在工作场所使用 git 每个人都对
  • Gerrit 和 Active Directory

    我正在尝试设置 Gerrit 以使用我们的公司 Active Directory 进行身份验证 我知道很多人都设法让它发挥作用 但它对我来说不起作用 如果我运行一个ldapsearch命令如下我得到了正确的结果 所以我知道我的搜索字符串是正
  • Git - 远程:错误:无法运行钩子/后接收:没有这样的文件或目录

    我收到错误 remote error cannot run hooks post receive No such file or directory 当尝试推送到远程时 接收后文件存在于正确的位置 testnew git hooks 并包含
  • Git:如何修改服务器的提交?

    我已经在 EC2 上的 git 服务器上推送了一些提交 而不是在 github 上 如何修改 git 服务器上的这些提交 操作就像 删除提交 例如变基 更改提交消息 是否可以 非常感谢 你几乎可以通过用力推动来完成所有事情 将您的本地树更改
  • 如何更改 GitHub 上的文件模式?

    git add test file git commit m first commit create mode 100644 test file git push git update index add chmod x test file
  • npm install 的问题(Angular)

    今天我尝试创建一个新项目 所以我使用这个命令 ng new NAME style less 并在我的cmder中弹出错误和警告 所以我卸载了 Roaming npm 和 npm cache 中的节点和文件 然后我安装了node并再次下载cm
  • 有没有一种干净的方法来处理两个以相同内容开头的原始 git 存储库?

    假设我有两个根据相同的初始内容创建的存储库 例如 如果我使用 git 来管理 etc apache2 中的 apache 配置文件 然后我运行git init分别在机器 A 和机器 B 上 此后 我对 machine b 进行了一些配置更改
  • Jmeter 和 Bitbucket 服务器负载测试

    我是 Jmeter 的新手 我有一个本地托管的 Bitbucket 服务器 有时 当 Bamboo plan 触发并发 git 克隆操作时 会发现 Bitbucket 服务器变得缓慢 无响应 我必须重新启动服务 我想通过对另一个本地创建的
  • 在 VS Code 中使用 Prettier 格式化 .ejs 文件

    我想使用 prettier 通过添加自定义规则来格式化我的 ejs 文件 现在我正在使用 html 的文件关联作为 ejs 文件 我在 settings json 文件中添加了以下代码 文件 关联 ejs html 不幸的是 Prettie
  • BitBucket 应用程序密码:git 命令行访问有哪些权限?

    我了解如何为 BitBucket 创建应用程序密码 如中所述Atlassian 的应用程序密码信息 https support atlassian com bitbucket cloud docs app passwords and 这个答
  • 如何在 Visual Studio 2013 中使用 Git 的外部 diff 工具?

    我找到了这个帖子 http architects dzone com articles how configure diff and merge这解释了如何让 Visual Studio 2013 在比较 Git 中的文件时使用内置 dif
  • 如何在 EGit 中创建正确的新本地和远程分支组合?

    我想在 Egit 中执行以下操作 git checkout b newbranch git push u origin newbranch 这给了我一个新的本地分支 将其推送到上游服务器并创建正确的跟踪参考 我如何在 Egit 中做同样的事
  • 推送更改到 Git 不起作用

    每次我想要提交命令 git push heroku master 时 系统都会要求我在 PowerShell 中输入凭据 当我输入 heroku 凭据 默认情况下连接到 git 时 我收到错误消息 但是 当我输入我的主目录中的 netrc

随机推荐