从所有提交中删除文件直到第一个分支点,但不从本地文件系统中删除它

时间:2016-12-18 14:43:35

标签: git git-filter-branch

假设你克隆了一个存储库,然后你创建了一个新的分支并在这个分支上做了几次提交(没有创建新的分支或推送到任何远程控制器)。在其中一些提交中,您通过错误引入(提交)了文件public int updateLocalPathTOAdImg(int ad_uid, String ad_img_url, String ad_img_local) { int result = 0; try { String sql = "UPDATE 'ad_img' SET " + "'ad_img_local' = '" + ad_img_local + "' " + "WHERE 'ad_uid' = " + ad_uid + " AND 'ad_img_url' = '" + ad_img_url + "'"; m_db.execSQL(sql); return result; ///////updated row count?? } catch (SQLException e) { e.printStackTrace(); } return result; } 。现在,如何从历史记录中删除该文件,而不是从本地文件系统中删除该文件(即保持文件未跟踪)?还假设父分支的名称未知(为了完全自动化该过程)。

1 个答案:

答案 0 :(得分:0)

我们在这里使用git filter-branch从索引中删除文件。 重要的是我们只使用git filter-branch进行第一个分支点的提交;如果没有,我们可能无法将分支合并回原始父级,我们也可能意外删除父分支中具有相同名称的文件。

如果我们假设父分支的名称是未知的,则会出现困难。但是,可以使用git branch --contains

解决此问题
filename=fileA
# git filter-branch will delete the local copy also, see 
# http://stackoverflow.com/q/33333200/2173773. So take a backup first.
cp "$filename" "$filename".bak 
readarray -t revlist < <(git rev-list HEAD)
sha1=""
for sha in "${revlist[@]}" ; do
    readarray -t branches < <(git branch --contains "$sha")
    # if there are more than a single branch that contains this commit
    # we have reached the branch point
    if (( ${#branches[@]} > 1 )) ; then
        sha1="$sha"
        break
    fi
done

git filter-branch -f --index-filter \
  "git rm --cached --ignore-unmatch $filename" "$sha1"..HEAD

# restore backup file
mv "$filename".bak "$filename"
相关问题