Difference between revisions of "GIT"
(→Intégration d'un repo A dans un repo B en conservant l'historique) |
(→Intégration d'un repo A dans un repo B en conservant l'historique) |
||
Line 247: | Line 247: | ||
Ajouter le sous-projet en tant que remote: |
Ajouter le sous-projet en tant que remote: |
||
$> git remote add -f package /tmp/package |
$> git remote add -f package /tmp/package |
||
+ | |||
+ | Combiner le nouveau remote: |
||
+ | $> git merge package/master |
Revision as of 15:45, 7 December 2016
Contents
- 1 Branches
- 2 Multiple remote repos
- 3 Appliquer des patches récalcitrantes
- 4 Changer le nom de l'auteur dans un commit (à vérifier, ne fonctionne pas)
- 5 Pour retrouver l'historique
- 6 Conversion SVN à GIT
- 7 Rebase root commit
- 8 List all authors of a particular git project
- 9 Nettoyage vieille références
- 10 Prévention erreur: Warning: No xauth data; using fake authentication data for X11 forwarding
- 11 Comment forcer un rebase lors d'un pull
- 12 Intégration d'un repo A dans un repo B en conservant l'historique
Branches
Pour créér une branche locale à partir d'une branche remote existante
$> git branch -t branch_name origin/branch_name |
Ce script peut-être utile pour créér une branche locale, l'enregistrer sur le serveur remote et ensuite la faire suivre (track):
#!/bin/bash
# git-create-branch <branch_name>
if [ $# -ne 1 ]; then
echo 1>&2 Usage: $0 branch_name
exit 1
fi
branch_name=$1
git checkout -b ${branch_name}
git push origin ${branch_name}
# For git < 1.7
git branch --track ${branch_name} origin/${branch_name}
# For git 1.7:
git branch --set-upstream ${branch_name} origin/${branch_name}
# For git 1.8
git branch -u origin/${branch_name}
Simplification
git checkout -b <branch_name>
git push -u <remote-name> <branch_name>
Pour effacer la branche distance (remote):
$> git push origin :${branch_name} |
Multiple remote repos
git remote add github-myrepo https://github.com/me/myrepo.git
In order to fetch from all the configured remotes and update tracking branches, but not merge into HEAD, do:
git remote update
Appliquer des patches récalcitrantes
$> git am -3 --ignore-whitespace <name.patch> |
Changer le nom de l'auteur dans un commit (à vérifier, ne fonctionne pas)
$> exec git commit --amend --author="Prénom Nom <prenom.nom@hugovil.com>" -C HEAD |
Pour retrouver l'historique
$> git reflog |
Conversion SVN à GIT
Cloner le répertoire SVN:
$> git svn clone --stdlayout --no-metadata -A ~/projets/vcs/svn-to-git-migration/users.txt http://svn.domain.com/repos myrepos |
If you want to keep other remote branches in your repo, you want to create a local branch for each one manually. If you don't do this, the branches won't get cloned in the final step
$> git checkout -b local_branch remote_branch
Tags are imported as branches. You have to create a local branch, make a tag and delete the branch to have them as tags in git. To do it with tag "v1":
$> git checkout -b tag_v1 remotes/tags/v1 $> git checkout master $> git tag v1 tag_v1 $> git branch -D tag_v1
Ce script permet d'automatiser l'importation des tags:
#!/bin/bash
if [ ${#} -ne 1 ]; then
echo "Missing tag name"
exit 1
fi
TAG=${1}
# Tags are imported as branches. You have to create a local branch, make a tag
# and delete the branch to have them as tags in git. To do it with tag "v1":
git checkout -b tag_${TAG} remotes/tags/${TAG}
git checkout master
git tag ${TAG} tag_${TAG}
git branch -D tag_${TAG}
Clone your GIT-SVN repo into a clean git repo:
$> git clone dest_dir-tmp dest_dir $> rm -rf dest_dir-tmp $> cd dest_dir
The local branches that you created earlier from remote branches will only have been copied as remote branches into the new cloned repository. For each branch you want to keep:
$> git checkout -b local_branch origin/remote_branch
Finally, remove the remote from your clean git repo that points to the now deleted temp repo:
$> git remote rm origin
Push changes to new remote repository
$> git remote add origin git@git.hugovil.com:repos/myrepos.git $> git checkout master $> git push --tags $> git push origin master $> git checkout branch1 $> git push origin branch1 $> ...
When cloning and to track remote branch:
$> git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/bozo
$> git checkout -b bozo origin/bozo Branch bozo set up to track remote branch bozo from origin. Switched to a new branch 'bozo'
Rebase root commit
Taken from:
http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git/2322798#2322798
git rebase -i allows you to conveniently edit any previous commits, except for the root commit. The following commands show you how to do this manually.
# tag the old root, "git rev-list ..." will return the hash of first commit
git tag root `git rev-list HEAD | tail -1`
# switch to a new branch pointing at the first commit
git checkout -b new-root root
# make any edits and then commit them with:
git commit --amend
# check out the previous branch (i.e. master)
git checkout @{-1}
# replace old root with amended version
git rebase --onto new-root root
# you might encounter merge conflicts, fix any conflicts and continue with:
# git rebase --continue
# delete the branch "new-root"
git branch -d new-root
# delete the tag "root"
git tag -d root
List all authors of a particular git project
git log --format='%aN' | sort -u
Nettoyage vieille références
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git for-each-ref --format="%(refname:short)" 'refs/tags' | xargs git tag -d
Prévention erreur: Warning: No xauth data; using fake authentication data for X11 forwarding
Cela se produit lors d'une opération sur un dépôt auquel on accède par SSH (ex: git pull).
Pour le régler, ajouter cette section à ~/.ssh/config:
Host git.hugovil.com
ForwardX11 no
Comment forcer un rebase lors d'un pull
Exemple avec la branche master:
$> git config branch.master.rebase true
Comment le faire globalement, pour toutes les branches:
$> git config --global branch.autosetuprebase always
Intégration d'un repo A dans un repo B en conservant l'historique
Travailler à partir d'une copie:
$> git clone repo-a repo-a.copie $> cd repo-a.copie
Effacer l'origine:
$> git remote rm origin
Déplacer les fichiers dans un sous-dossier 'dossier-a':
$> git filter-branch --index-filter 'git ls-files -s | sed "s-\t\"*-&dossier-a/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" ' HEAD
Créér nouveau clône du projet principal:
$> git clone ssh://<project-repo> /tmp/project $> cd /tmp/project
Ajouter le sous-projet en tant que remote:
$> git remote add -f package /tmp/package
Combiner le nouveau remote:
$> git merge package/master