Keep Data in .git/refs

Git keeps references to heads (branches) and tags in .git/refs. This is very convenient because you can obtain the SHA1 ID of any tag just by doing cat .git/refs/tags/<tag_name>.

But this mechanism only works if you do not run git gc. The garbage collector packs tags by default, that means the files from .git/refs/tags will be removed and their SHA1 IDs will be stored in file .git/packed-refs instead.

To prevent this you can use the following in your .git/config:

[gc]
     packrefs = 0

See man git-pack-refs for more details.

Avoiding Tag Collisions

If you fetch tags from multiple remote repositories, it may happen that they will generate conflicts because all tags are stored in .git/refs/tags directory. This will happen, for example, if you fetch objects from both the sip-router git repository and also the repository at http://git.sip-router.org/ser. The reason is that both of them originate from a single cvs repository and thus they contain tags with identical names. To avoid this situation you can do the following in your .git/config:

[remote "sr"]
    ....
    fetch = refs/tags/*:refs/tags/sr/*
    tagopt = --no-tags

[remote "cvs"]
    ....
    fetch = refs/tags/*:refs/tags/cvs/*
    tagopt = --no-tags

The configuration above will fetch all tags from both repositories explicitly and will store them in subdirectories under .git/refs/tags to avoid conflicts in file names. Because you download tags explicitly you can tell git-fetch not to download any tags using the tagopt option.

GIT commands for merging of modules

This will show you how the git commands to merge modules, e.g. ser's avpops module is removed and K's avpops module is used as comon module.

# we start in the local master branch
git checkout master

# create a new local branch called "darilion/avpops" based on 
# the remote master branch, and checkout into the newly created branch
git checkout -b darilion/avpops origin/master

# remove the old ser module
git rm -r modules_s/avpops/

# move the Kamailio module into the common modules directory
git mv modules_k/avpops/ modules/

# do whatever is need, eg. modify the code, ...

# check if sip-router builds and the code is working as expected

# check the status (modified files)
git status

# add all modifications for the next commit
git add .

# commit the changes (which were added in the previous step)
# (this will commit into the local working branch, in this case darilion/avpops)
# make sure to add a commit message according to these rules:
#   http://sip-router.org/wiki/devel/git-commit-guidelines
git commit

# verify the commit
git log -1

# prepare for push into the remote master branch: make sure
# that our local branch is up2date with commits added to 
# remote main branch
git fetch origin
git rebase origin/master

# push our changes from the local "darilion/avpops" branch 
# into the remote master branch
git push origin darilion/avpops:master

# cleanup: change into another local branch and delete the local avpops branch
git checkout master
git pull --rebase origin master # fetch previously commited commit
git branch -d darilion/avpops