我在 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已执行,但日志仍然列出带冒号的文件名:-(