在GIT中更改文件名

时间:2017-10-31 12:10:23

标签: git bash shell

我正在进行预接收挂钩。我希望所有文件都以大写字母命名。如果文件不符合这个条件,我们应该停止推送并要求用户更改文件名。我试过了

if [[ "$fileName" =~ [a-z] ]]; then
  echo -e "file should be in upper Case" >&2
  exit 1;
fi 

用户使用

更改文件名后停止推送
git mv -f tes TES

我总是得到文件是小写的错误。我应该从上次提交中删除该文件并使用新名称再次提交吗?

1 个答案:

答案 0 :(得分:2)

听起来好像钩子正在工作。但是,这并没有从本地repo的ref的历史记录中删除带有小写文件名的提交。

如果用户只是推送一个提交,那么他们可以修复文件名然后

git commit --amend

更常见的是,用户可能会同时推送多个提交。假设您的钩子检查所有提交(如果不是,小写名称将随时间泄漏到您的历史记录中),用户将必须在推送之前修复整个历史记录。这可以使用git filter-branch完成。要清理一个名为the_branch的分支,以便可以推送它:

  • 编写一个脚本,将工作树中的任何文件重命名为全大写。您可以随意调用它,但是为了讨论,我们可以说ucfn.sh
  • 将脚本用作树过滤器

所以

git filter-branch --tree-filter=ucfn.sh -- the_branch

或者

git filter-branch --tree-filter=ucfn.sh -- origin/the_branch..the_branch

(你可以通过切换到index-filter来加快运行速度(如果有很多新的提交,或者工作树很大),但由于你没有工作,脚本更难写index-filter中的树。)

最好的方法是帮助用户避免这种情况,方法是为他们提供一个预提交挂钩,检查推送是否被接受,否则拒绝提交。就像任何本地钩子一样,他们必须选择设置它并且你不能强迫它们使用它 - 所以你仍然需要后接收挂钩 - 但这可以阻止你的用户进入在他们可以推动之前他们有一个巨大的清理角落。