[英]How to merge the changes of fileA with fileB while also overwriting the changes of fileA with changes in fileB
我有一个用例,我在几个文件中复制相同的代码,所以我想做的是用基本代码创建一个公共文件,而所有其他文件从基本文件和一些文件继承相同的代码。
编辑: 这可能是合并两个文件的方法之一,但这并没有太大帮助,我仍然需要手动 go 关于删除和保留我想要的内容,我想自动化这个过程。 我在想使用diff
或sdiff
会有帮助吗? 但这些是交互式的,那么我们如何自动化呢?
例如:
基地.py
def basefunc1(a, b):
c = a + b
return c
def basefunc2(a):
b = a**2
return b
派生.py
def derivedfunc(a, b):
c = a + b
return c
def basefunc2(a, b):
c = a**b
return c
output.py
def basefunc1(a, b):
c = a + b
return c
def basefunc2(a, b):
c = a**b
return c
def derivedfunc(a, b):
c = a + b
return c
这里basefunc1(a, b)
和derivedfunc(a, b)
是唯一的,应该包含在output中,但是basefunc2(a, b)
是在derived文件中编辑的,所以应该写到output中。基本上在diff
时derived
与base
比较,base 中的删除(wrt derived)和 derived(wrt base)中的添加应该是 output 中的添加,但是 derived(wrt base)中的更改应该被覆盖。
我的方法:
我认为可行的是:
git diff --no-index file1.py file2.py | grep '^+' | sed 's/^+//' | sed '/^++/d'
使用这个我会找到更改的部分,但是我必须这样做两次,因为这只给出了派生文件的添加和更改,第二次将比较这个和基础文件以获得第一个文件。
我也试过
git merge-file file1.py file2.py file3.py
合并到 file2 的 file1 wrt 空 file3,但后来我无法弄清楚如何删除从<<<<<<<<
到========
的所有行,因为这些将是我当前的更改想用传入的更改替换,但我也想保留当前文件的唯一当前更改,同时也保留唯一的传入更改。
我写了这个 python 脚本来做你需要的。 根据您的示例文件,它可以工作。
#!/usr/bin/python3
import importlib
import os
import sys
from inspect import getmembers, isfunction, getsource
if len(sys.argv) < 3:
print("ERROR: must have 3 arguments.")
print(" file 1: base file.")
print(" file 2: derived file.")
print(" file 3: output file.")
exit
else:
# files to process
file1 = str(sys.argv[1])
file2 = str(sys.argv[2])
outfile = str(sys.argv[3])
# import sees packages without the extension
modulename1 = os.path.splitext(file1)[0]
modulename2 = os.path.splitext(file2)[0]
# load both modules
module1 = importlib.import_module(modulename1, package=None)
module2 = importlib.import_module(modulename2, package=None)
# get a set of functions in file1
functions1 = getmembers(module1, isfunction)
functionsset1 = set([i[0] for i in functions1])
print(functionsset1)
# {'basefunc1', 'basefunc2'}
# get a set of functions in file2
functions2 = getmembers(module2, isfunction)
functionsset2 = set([i[0] for i in functions2])
print(functionsset2)
# {'basefunc2','derivedfunc'}
# Empty the output file
open(outfile, 'w').close()
# Write the functions into the outfile
with open(outfile, "a") as outputfile:
# 1- functions only in file1
# print these directly to the output file
functionsdifflist1 = list(functionsset1.difference(functionsset2))
print(functionsdifflist1)
for f in functionsdifflist1:
objectname = 'module1.' + str(f)
outputfile.write(getsource(eval(str(objectname))))
# 2- functions only in file2
# print these directly to the output file
functionsdifflist2 = list(functionsset2.difference(functionsset1))
print(functionsdifflist2)
for f in functionsdifflist2:
objectname = 'module2.' + str(f)
outputfile.write(getsource(eval(str(objectname))))
# 3- functions present in both
# print the version from file2
functionsintersectlist = list(functionsset1.intersection(functionsset2))
print(functionsintersectlist)
# basefunc2
for f in functionsintersectlist:
objectname = 'module2.' + str(f)
outputfile.write(getsource(eval(str(objectname))))
使用方法: ./script.py base.py derived.py output.py
它能做什么:
免责声明:
try: catch:
脚本,在某些情况下它可能会失败。eval
。 这是我发现将 object 的名称存储在 function getsource
的变量中的唯一方法。print
语句,我用它们来处理代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.