背景:只想比較某2個分支的某2次提交的差異,不需要帶上父提交。
以commitA為基準,用commitB去比較差異
直接上代碼:
commitA=xxxx1
commitB=xxxx2
outputFile="output.txt"# 獲取與第一個父提交的文件列表
filesA=$(git diff --name-only $commitA^1 $commitA)
filesB=$(git diff-tree --no-commit-id --name-only -r $commitB)# 創建關聯數組來存儲文件狀態
declare -A fileStatus# 將 filesA 和 filesB 的文件狀態存入關聯數組
for file in $filesA; dofileStatus["$file"]="DELETE"
donefor file in $filesB; doif [[ -n "${fileStatus["$file"]}" ]]; thenfileStatus["$file"]="MODIFY"elsefileStatus["$file"]="ADD"fi
done# 輸出文件狀態
for file in "${!fileStatus[@]}"; doecho "$file (${fileStatus[$file]})" >> "$outputFile"
done
可以用python實現美化樹結構
def build_tree(file_list):tree = {}for line in file_list:# 分割文件路徑和狀態file_path, status = line.rsplit(' ', 1)parts = file_path.split('/')current = treefor part in parts[:-1]: # 處理目錄部分if part not in current:current[part] = {}current = current[part]# 處理文件部分file_name = parts[-1]current[file_name] = status.strip('()') # 只在文件上存儲狀態return treedef print_tree(node, prefix='', is_last=True):for i, (key, value) in enumerate(node.items()):connector = '└── ' if is_last else '├── '# 判斷是否是文件,最后一個文件不加 '/'if isinstance(value, str): # 如果是文件,直接打印狀態print(prefix + connector + key + ' (' + value + ')')else: # 如果是目錄,打印目錄名print(prefix + connector + key + '/')if isinstance(value, dict):new_prefix = prefix + (' ' if is_last else '│ ')print_tree(value, new_prefix, i == len(node) - 1)# 讀取文件內容
with open('output.txt', 'r') as file:file_content = file.readlines()file_content = [line.strip() for line in file_content]# 構建樹形結構
file_tree = build_tree(file_content)# 打印樹形結構
print("文件樹形結構:")
print_tree(file_tree)