如何从 GIT 存储库历史记录中删除文件名中包含冒号 : 的路径的所有文件?

2023-12-02

我在 Debian 10 Linux 上的 GIT 存储库中存储了带冒号的 ISCSI 节点文件名。

Example:

'iscsi/nodes/iqn.2000-01.com.synology:NAS01-DS916.nas/ff11::111:11ff:ff1f:1ff1,3260,1/default'
'iscsi/send_targets/1.2.3.4,3260/iqn.2000-01.com.synology:NAS01-DS916.nas,ff11::111:11ff:ff1f:1ff1,3260,1,default'

但在 Windows 上检出失败,因为冒号在 Windows 文件名中是无效字符。

我在 Windows 结帐时收到以下 GIT 错误:

error: invalid path 'iscsi/nodes/iqn.2000-01.com.synology:NAS01-DS916.nas/ff11::111:11ff:ff1f:1ff1,3260,1/default'
...
error: invalid path 'iscsi/send_targets/1.2.3.4,3260/iqn.2000-01.com.synology:NAS01-DS916.nas,ff11::111:11ff:ff1f:1ff1,3260,1,default'

问题:

1) 如何列出完整的 GIT 存储库历史记录中所有带有冒号 : 的路径?

2) 如何从 GIT 存储库历史记录中删除文件名中至少有一个冒号 : 的路径的所有文件?

1) 的解决方案:

Works1:

git log --all --name-only -m --pretty= -- '*:*' | sort -u

Works2(仅适用于指定的 repo master):

git ls-tree -r master --name-only | grep ":"

Works3:最后我用它来列出文件名中带有冒号的文件:

git log --format="reference" --name-status --diff-filter=A "*:*" >/opt/git_repo_files_w_colons.txt

更新 1 为 2):

I got

Aborting: Refusing to destructively overwrite repo history since
this does not look like a fresh clone.
  (expected freshly packed repo)
Note: when cloning local repositories, you need to pass
      --no-local to git clone to avoid this issue.
Please operate on a fresh clone instead.  If you want to proceed
anyway, use --force.

执行时

git filter-repo --invert-paths --path-match "*:*"

更新2为2):

克隆存储库的副本:

git clone --no-local /source/repo/path/ /target/path/to/repo/clone/
# Cloning into '/target/path/to/repo/clone'...
# remote: Enumerating objects: 9534, done.
# remote: Counting objects: 100% (9534/9534), done.
# remote: Compressing objects: 100% (4776/4776), done.
# remote: Total 9534 (delta 4216), reused 8042 (delta 3136), pack-reused 0
# Receiving objects: 100% (9534/9534), 7.40 MiB | 17.08 MiB/s, done.
# Resolving deltas: 100% (4216/4216), done.

从存储库历史记录中删除带冒号的文件:

git filter-repo --invert-paths --path-match "*:*"
# Parsed 591 commits
# New history written in 0.47 seconds; now repacking/cleaning...
# Repacking your repo and cleaning out old unneeded objects
# HEAD is now at 501102d daily autocommit
# Enumerating objects: 9534, done.
# Counting objects: 100% (9534/9534), done.
# Delta compression using up to 8 threads
# Compressing objects: 100% (3696/3696), done.
# Writing objects: 100% (9534/9534), done.
# Total 9534 (delta 4216), reused 9534 (delta 4216), pack-reused 0
# Completely finished after 1.33 seconds.

检查仍然显示带有冒号的文件名:

git log --format="reference" --name-status --diff-filter=A "*:*"
# A    iscsi/nodes/iqn.2000-01.com.synology:NAS01-DS916.nas/ff11::111:11ff:ff1f:1ff1,3260,1/default
# ...

不幸的是,似乎filter-repo已执行,但日志仍然列出带冒号的文件名:-(


更好的方法可能是不在 Windows 上签出这些文件,请参阅稀疏签出工具,或者使用 Windows 可以处理的字符重命名它们,但要回答所提出的问题:

  1. 如何列出完整的 GIT 存储库历史记录中带有冒号 : 的所有路径?
git log --all --name-only -m --pretty= -- '*:*' | sort -u
  1. 如何从 GIT 存储库历史记录中删除文件名中至少有一个冒号 : 的路径的所有文件?
git filter-branch --prune-empty --index-filter '
        git ls-files "*:*" | git update-index --remove --stdin
' -- --all

这将重写你的整个历史从第一次提交开始你就必须改变。在临时克隆中执行此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 GIT 存储库历史记录中删除文件名中包含冒号 : 的路径的所有文件? 的相关文章

  • PHP Github Pull 脚本错误“权限被拒绝(公钥)”

    我已经设置了一个 PHP 脚本来执行 GitHub 拉取 这包含在我的 Github 文件夹中 home mysite public html github github pull php 我的服务器已经有 SSH 公钥 就像我执行git
  • 使用 git 合并两个截然不同的分支?

    我有我的master分支和我的verydifferentbranch它们有相同的祖先 大约 300 次提交前 现在verydifferentbranch功能完整我想把它放在master下面branch 进行变基会导致每个补丁都有很多合并冲突
  • 推送更改到 Git 不起作用

    每次我想要提交命令 git push heroku master 时 系统都会要求我在 PowerShell 中输入凭据 当我输入 heroku 凭据 默认情况下连接到 git 时 我收到错误消息 但是 当我输入我的主目录中的 netrc
  • Git hook:如果创建了新分支,则将新文件添加到存储库

    我正在编写一个 git hook 它检查是否创建了新分支 如果是 则将一些预定义文件添加到该新分支的存储库中 一些配置文件 然而 由于分支实际上正在创建过程中 所以我的逻辑失败了 目前我正在这样做post receive钩子 看起来像这样
  • 如何应用 .diff 文件

    我有一个 diff 类型文件 看起来像爆炸了 diff git a res User lua b res User lua index db8c2cc 4d2af0f 100644 a res User lua b res User lua
  • 如何在 Windows 上使用 cygwin、git bash 和 vagrant VM 中的 git 设置 git?

    My Setup 我们在工作中使用 Windows 10 我的任务是使用 Vagrant 构建一个我们都想使用的开发虚拟机 我们通过 Vagrant SSH 挂载将 git 文件夹挂载到虚拟机中 目前效果非常好 我们还使用 Visual S
  • 将 git dcommits 切换到 svn 分支

    I had master dcommit到 和rebase来自 颠覆trunk 我创建了一个中间 Subversion 分支tc 合并来自 2 个不同分支的更改 使用 git branch master git svn branch tc
  • 测量大型源树中的“接近度”

    作为我之前提出的问题的一部分找到两个来源之间的最佳匹配 https stackoverflow com questions 13898659 finding what git commit some code spawned from 其中
  • 如何使用和理解wso2 git仓库?

    我刚刚开始对wso2感兴趣 我正在寻找移动设备管理解决方案 所以我测试了 wso2 EMM 但我发现了一些限制 我想知道是否可以自己实现 我的问题是我完全迷失在 wso2 git 存储库中 有没有我错过的指导书或逻辑 如果有人帮助我解决这个
  • 回购:找不到命令?

    我是 git 和 repo 的新手 我使用的是window 7 所以我使用cygwin 我已经从 cygwin 安装程序安装了 git 之后我尝试在 cygwin 中使用以下命令进行存储 repo init u git android gi
  • git 查找胖提交

    是否可以获取有关每次提交中的更改浪费了多少空间的信息 以便我可以找到添加了大文件或大量文件的提交 这一切都是为了尝试减少 git repo 的大小 变基并可能过滤提交 你可以这样做 git ls tree r t l full name H
  • Git 日志历史记录

    对于版本控制来说 重要的一件事是知道谁做了什么更改 如果某些内容发生了变化 而我不知道为什么要进行更改 我会查看历史并询问进行更改的人 当我探索 git 时 让我对这个功能有点紧张的一件事是它似乎很容易伪造 是什么阻止我将同事姓名 电子邮件
  • GIT:无效路径“.editorconfig”

    从 master 克隆项目时出现以下错误 错误 无效路径 editorconfig 致命 无法签出工作树 警告 克隆成功 但结账失败 您可以使用 git status 检查签出的内容 并使用 git Restore source HEAD
  • Git Add - 致命:添加文件失败

    我的 git cmd exe 窗口如下所示 git add NextFolder error unable to create temporary file No such file or directory error NextFolde
  • egit:设置gitignore忽略所有eclipse项目文件

    我在 github 上有一个项目 我想从中删除所有与 eclipse 相关的文件 并允许克隆它的人使用他们想要的任何 ide 这是该项目 https github com vedi0boy Archipelo https github co
  • 在 Xcode 9 上切换分支

    我无法找到使用 Xcode 9 切换分支的菜单项 工作副本菜单似乎已经消失 有任何想法吗 Xcode 9 Xcode 8 Press 2 to open the new Source Control Navigator 右键单击master
  • Git 会删除空文件夹吗? [复制]

    这个问题在这里已经有答案了 我已提交一个项目并将其推送到我的 GitHub 帐户 该项目包含以下部分文件结构 server conf some files java lib java 和 lib 文件夹为空 从 GitHub 下载我的项目时
  • 永久删除 git 提交历史记录

    我需要永久且完全删除 git 存储库的提交历史记录并继续使用文件的当前版本 旧版本 提交不得以任何方式访问 我尝试创建一个新的主分支 删除所有其他分支 但是当我在 git bash 中尝试 git show xxxx 时 旧的提交继续显示
  • github Diff 截断错误

    在 github 中发出拉取请求并审查更改时 我们收到了 Diff Truncated 错误 如下所示 任何人都可以帮助解决这个问题 拉取请求可能会触发以下提到的限制之一GitHub 支持 https stackoverflow com a
  • git 工作目录中的更改拒绝恢复

    我的 git 工作目录中有五个文件git status显示为已修改 当我git diff他们 整个文件显示为已更改 我有core autocrlf true但似乎没有效果 当我试图从同事那里获取更改时 真正的问题出现了 修改 的文件之一会被

随机推荐