作为this question的后续内容,我有一个带有以下目录结构的git存储库
conferences
├── conferenceA
│ └── proceedings
├── conferenceB
│ └── proceedings
└── conferenceC
└── proceedings
我想创建一个新的存储库,其中只包含conferenceA的内容而没有会议记录。
所以我在conferenceA中起草了一个shell脚本
cd $(git rev-parse --show-toplevel)
tmp=$(git subtree split --prefix=conferenceA)
git filter-branch --index-filter 'rm -rf proceedings' $tmp
git push conferenceAslides $tmp2:master --force
哪个有多个问题:
$tmp2
filter-branch
不接受哈希作为我的参数
pseyfert@computer > git filter-branch --tree-filter 'rm -rf proceedings' -- $tmp
Which ref do you want to rewrite?
据我了解git-filter-branch reference,过滤的内容应该与git rev-list
相同,$tmp
散列对我来说似乎很好({{1 }}和git rev-list $tmp
似乎提供相同的输出)
所以我的问题是:如何在不指定分支名称的情况下使用git checkout -b test $tmp; git rev-list test
?我应该使用不同的命令吗?
答案 0 :(得分:2)
重写之后,您的脚本将要做的下一件事是将重写的提交的哈希值推送到master
。这意味着您正在重写master
的历史记录,那么为什么不告诉filter-branch
重写master
?
换句话说:第二个“问题”不是问题;这是第一个问题的解决方案。是的,如果filter-branch
允许您重写任意SHA-ID,则结果将是无法访问的提交,其ID您不知道;所以相反filter-branch
从ref重写,然后移动ref,这样你就可以通过转到ref来找到重写的提交。