Committing Machine Specific Configuration Files

后端 未结 10 1367
我在风中等你
我在风中等你 2020-11-22 06:43

A common scenario when I develop is that the codebase will have several config files which require machine specific settings. These files will be checked into Git and other

10条回答
  •  囚心锁ツ
    2020-11-22 07:24

    Another approach is to maintain local changes to common configuration files in another private branch. I do this for some projects that require several local changes. This technique may not be applicable to all situations, but it works for me in some cases.

    First I create a new branch based on the master branch (in this particular case I'm using git-svn so I need to commit from master but that's not terribly important here):

    git checkout -b work master
    

    Now modify the configuration file(s) as necessary and commit. I usually put something distinctive in the commit message like "NOCOMMIT" or "PRIVATE" (this will be useful later). At this point, you can work away on your private branch using your own config file.

    When you want to push your work back upstream, cherry-pick each change from your work branch to the master. I have a script to help do this, which looks something like this:

    #!/bin/sh
    
    BRANCH=`git branch | grep ^\\* | cut -d' ' -f2`
    if [ $BRANCH != "master" ]; then
      echo "$0: Current branch is not master"
      exit 1
    fi
    
    git log --pretty=oneline work...master | grep -v NOCOMMIT: | cut -d' ' -f1 | tac | xargs -l git cherry-pick
    

    This first checks to make sure I'm on the master branch (sanity check). Then, it lists each commit in work, filters out the ones that mention the NOCOMMIT keyword, reverses the order, and finally cherry-picks each commit (now from the oldest first) into master.

    Finally, after pushing the changes in master upstream, I switch back to work and rebase:

    git checkout work
    git rebase master
    

    Git will reapply each of the commits in the work branch, effectively skipping over the one(s) that have already been applied in master through the cherry-picking. What you should be left with is only the NOCOMMIT local commits.

    This technique makes the push process a bit more time-consuming, but it solved a problem for me so I thought I'd share.

提交回复
热议问题