如何跨Git存储库中的所有分支更新文件

问题描述:

在存储库中有多个分支的情况下:如何简单地跨所有分支更新文件。如何跨Git存储库中的所有分支更新文件

在这种情况下,它是一个类似于bashrc的文件,它指定了一些环境变量。我在过去更新了主分支版本,然后重新分配了每个分支。这有一种n + 1的开销,我想避免。

+2

你不行。编写脚本,依次访问每个分支,并更改(或从某处复制)其上的文件。您可以通过采用与您在第一个(working?master?)分支上提交的Git对象完全相同的Git对象来避免检查,如果可以的话,请准确地获取**相同的文件内容。 – fork0 2012-08-13 19:32:33

+0

我认为这会更好地脚本rebasing。无论您是重新分配还是复制每个分支中的文件,开销都是一样的。那么,为什么不有一个没有重复消息和变更集的清晰历史记录? – 2012-08-14 06:14:44

为了延长fork0comment,你需要结合:

即:

#!/bin/bash 
branches=() 
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)" 
for branch in "${branches[@]}"; do 
    if [[ "${branch}" != "master" ]]; then 
    git checkout ${branch} 
    git checkout master -- yourFile   
    fi 
done 

(这是适应你的情况,因为在这里它总是从master分支结帐的文件。)

我认为,它有点晚,但下面的脚本将帮助你在这。

#!/bin/bash 

if [ $# != 1 ]; then 
    echo "usage: $0 <filename>" 
    exit; 
fi 

branches=`git for-each-ref --format='%(refname:short)' refs/heads/\*` 
curr_branch=`git rev-parse --abbrev-ref HEAD` 
# echo "curr_branch:"$curr_branch 

filename=$1 
file_in_repo=`git ls-files ${filename}` 

if [ ! "$file_in_repo" ]; then 
    echo "file not added in current branch" 
    exit 
fi 

for branch in ${branches[@]}; do 
    if [[ ${branch} != ${curr_branch} ]]; then 
     git checkout "${branch}" 
     git checkout "${curr_branch}" -- "$filename" 
     git commit -am "Added $filename in $branch from $curr_branch" 
     echo "" 
    fi 
done 
git checkout "${curr_branch}" 
+0

有趣的方法也是如此。 +1 – VonC 2017-07-13 08:37:51

+0

请记得检查您当前回购中的未定变化。 我稍后添加来检查当前分支中的任何本地更改。 ** git status --untracked-files = no --porcelain ** – 2017-07-14 02:57:55