git filter-tree without branch

时间:2017-09-14 10:50:19

标签: git git-filter-branch

作为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

哪个有多个问题:

  1. 在使用filter-branch重写历史记录后,创建了新的提交,我不知道要填充的哈希$tmp2
  2. filter-branch不接受哈希作为我的参数
  3. 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?我应该使用不同的命令吗?

1 个答案:

答案 0 :(得分:2)

重写之后,您的脚本将要做的下一件事是将重写的提交的哈希值推送到master。这意味着您正在重写master的历史记录,那么为什么不告诉filter-branch重写master

换句话说:第二个“问题”不是问题;这是第一个问题的解决方案。是的,如果filter-branch允许您重写任意SHA-ID,则结果将是无法访问的提交,其ID您不知道;所以相反filter-branch从ref重写,然后移动ref,这样你就可以通过转到ref来找到重写的提交。