假设你克隆了一个存储库,然后你创建了一个新的分支并在这个分支上做了几次提交(没有创建新的分支或推送到任何远程控制器)。在其中一些提交中,您通过错误引入(提交)了文件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;
}
。现在,如何从历史记录中删除该文件,而不是从本地文件系统中删除该文件(即保持文件未跟踪)?还假设父分支的名称未知(为了完全自动化该过程)。
答案 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"