从所有 git 历史记录中删除文件
remove file from all git history
基于此 article,我创建了一个小脚本,用于删除整个 git 存储库、所有分支、标记和提交中出现的所有文件。
剧本:
#!/usr/bin/env node
var child_process = require('child_process');
if (process.argv.length < 3){
console.error('USAGE: git-forget path/to/file')
process.exit(1);
}
var path = process.argv[2];
var phase = 0;
function printLog(error, stdout, stderr) {
if (error) {
console.error('ERROR' + error);
}
console.log(++phase);
console.log(stdout);
}
child_process.execSync('git filter-branch --force --index-filter \'git rm -f --cached --ignore-unmatch '+ path +'\' --prune-empty --tag-name-filter cat -- --all');
child_process.execSync('echo "' + path + '" >> .gitignore', printLog);
child_process.execSync('git add .gitignore');
child_process.execSync('git commit -m "Add ' + path +' to .gitignore"',printLog)
child_process.execSync('git push origin --force --all',printLog);
child_process.execSync('git push origin --force --tags',printLog);
这个脚本在几个回购协议(私有的)上工作,在一个特定的回购协议上它保留了对我试图删除的文件的初始提交。在脚本 运行 之后,我做了这个 git log --all -- .npmrc
并找到了初始提交。我错过了什么?
我认为发生的事情是你忘记告诉这个 repo 的其他用户不要 merge 他们对新历史的更改,而是 rebase。
来自您引用的文档:
Tell your collaborators to rebase, not merge, any branches they
created off of your old (tainted) repository history. One merge commit
could reintroduce some or all of the tainted history that you just
went to the trouble of purging.
再次尝试 运行 相同的脚本,发现没有人通过合并 his/her 本地更改到新头来重新引入旧历史。
基于此 article,我创建了一个小脚本,用于删除整个 git 存储库、所有分支、标记和提交中出现的所有文件。 剧本:
#!/usr/bin/env node
var child_process = require('child_process');
if (process.argv.length < 3){
console.error('USAGE: git-forget path/to/file')
process.exit(1);
}
var path = process.argv[2];
var phase = 0;
function printLog(error, stdout, stderr) {
if (error) {
console.error('ERROR' + error);
}
console.log(++phase);
console.log(stdout);
}
child_process.execSync('git filter-branch --force --index-filter \'git rm -f --cached --ignore-unmatch '+ path +'\' --prune-empty --tag-name-filter cat -- --all');
child_process.execSync('echo "' + path + '" >> .gitignore', printLog);
child_process.execSync('git add .gitignore');
child_process.execSync('git commit -m "Add ' + path +' to .gitignore"',printLog)
child_process.execSync('git push origin --force --all',printLog);
child_process.execSync('git push origin --force --tags',printLog);
这个脚本在几个回购协议(私有的)上工作,在一个特定的回购协议上它保留了对我试图删除的文件的初始提交。在脚本 运行 之后,我做了这个 git log --all -- .npmrc
并找到了初始提交。我错过了什么?
我认为发生的事情是你忘记告诉这个 repo 的其他用户不要 merge 他们对新历史的更改,而是 rebase。 来自您引用的文档:
Tell your collaborators to rebase, not merge, any branches they created off of your old (tainted) repository history. One merge commit could reintroduce some or all of the tainted history that you just went to the trouble of purging.
再次尝试 运行 相同的脚本,发现没有人通过合并 his/her 本地更改到新头来重新引入旧历史。