使用filter smudge / clean重命名git文件

时间:2014-08-16 04:22:22

标签: git filter

我喜欢的方法是涂抹重命名文件,然后清理将其重命名为git。

(我也喜欢在Windows上工作 - Cygwin罚款/首选 - 和* nix。)

以下是我想要发生的事情:

chipA1.py:
  # Version "@(#)0_14_5"
  # ... more python code here ...

chipB9.py:
  # Version "@(#)0_3_2"
  # ...

我希望git将这些文件存储在repo中作为chipA1.py和chipB9.py,因此所有对它们的编辑都可以像往常一样通过git进行跟踪,但是git pullgit clone使用它们出现在我的(Windows Cygwin或Mac OS X)本地文件系统上:

chipA1_0_14_5.py
chipB9_0_3_2.py

在我们的工具集IDE中编辑chipA1_0_14_5.py文件后,我希望 clean 过滤器自动将其重命名为chipA1.py,即剥离任何下划线+第一个下划线后的数字。

可以使用git smudge / clean来完成吗?

我只需要为少量文件执行此操作,所有文件都应该在同一个repo中,因为它们相互关联并通过RPC机制相互协作。因此,我会在我们的.gitattributes文件中单独添加需要涂抹污迹和清洁过滤器的六个左右文件名。

基本原理:我需要这样做,因为我们功能不佳的嵌入式工具包使得基本上不可能看到在芯片组上运行的目标的代码内容,所以我们需要能够识别哪个版本的chipA1.py或者通过在此工具包的IDE中查看文件名本身的#右版本来运行chipB9.py。

这就是我所拥有的,但的工作(碰巧是用ruby编写的,但我打开了bash shell脚本,可以在OS X和Cygwin中使用在Windows上):

./ add_ver:

#! /usr/bin/env ruby
data = STDIN.read

filename = ARGV.first

ver = data[/@\(#\)([\d_]*$)/]
ver = $1

dot = filename.rindex('.') if filename
filename_with_ver = filename[0...dot] + '_' + ver + filename[dot...filename.length]

puts data.
        gsub('$Version$', '$Version: ' + ver + ' $').
        gsub('$Filename$', '$Filename: ' + filename + ' should be transformed into: ' + filename_with_ver + ' $')
STDIN.close

exit system("git mv -v -f #{filename} #{filename_with_ver}")

./ remove_ver:

#! /usr/bin/env ruby
data = STDIN.read

filename_with_ver = ARGV.first

ver = data[/@\(#\)([\d_]*$)/]
ver = $1

dot = filename_with_ver.rindex('.')
filename_without_ver = filename_with_ver[0...dot].split('_').first + filename_with_ver[dot...filename_with_ver.length]

puts data.
        gsub(/$Version.*$/, '$Version$').
        gsub(/$Filename.*$/, '$Filename$')
STDIN.close

exit system("git mv -v -f #{filename_with_ver} #{filename_without_ver}")

请注意,我已经同时尝试了git mv -v -fmv(没有git),也没有完成我想要的任务。

我的config -l的相关部分是:

filter.filenamevers.smudge=./add_ver %f
filter.filenamevers.clean=./remove_ver %f

我的.gitattributes(我现在只使用test.txt作为测试文件,以后它会变成foo.py):

*.txt filter=filenamevers

最后,这是我的测试文件: 的test.txt:

# Current Release: @(#)1_0_1

# $Version$
# $Filename$

当然$ Version $和$ Filename $字段只是' test'字段,我真的只需要/想要第一行,这就是我将如何修改签出文件名转换成的名称。

运行时似乎没有使用通常的git rm test.txt ; git checkout -- test.txt方法来运行它通过git的过滤器运行:

$ ./add_ver < test.txt test.txt
# Current Release: @(#)1_0_1

# $Version: 1_0_1 $
# $Filename: test.txt should be transformed into: test_1_0_1.txt $
Renaming test.txt to test_1_0_1.txt

显然,我有点像鸡肉和鸡肉。鸡蛋的情况,因为git跟踪test.txt并且我试图mv。关于如何完成我想要的任何建议?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我的第一次尝试是进行重新命名后检查,一个简单的跟踪文件列出哪些,并告诉我的编辑读取该列表并在写入列表中的文件时自动保存两个副本。在vim中它是bufwritepost autocommand,任何程序员的编辑都应该能够为你做这个。