====== Git ======
* http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
===== Új, független ág létrehozása =====
* http://book.git-scm.com/5_creating_new_empty_branches.html
git symbolic-ref HEAD 'refs/heads/newbranch'
rm '.git/index'
git clean -fdx
git commit --allow-empty -m 'Initial commit'
===== Minden változás lekérése a remote-okról =====
git fetch --all --prune --tags
| ''%%--%%all'' | minden remote használata |
| ''%%--%%prune'' | a távol törölt branch-ek törlése helyileg |
| ''%%--%%tags'' | a távol változott tag-ek lekövetése helyileg |
===== Minden változás feltöltése a remote-ra =====
git push origin --all
git push origin --tags
| ''%%--%%all'' | minden referencia feltöltése |
| ''%%--%%tags'' | minden tag feltöltése / frissítése |
A ''%%--%%all'' nem foglalja magába a ''%%--%%tags''-et!
===== Remote törlése az összes branch-ével együtt =====
git remote rm 'origin-foo'
Ez a parancs csak a referenciákat távolítja el, így érdemes a nem elérhető objektumok kézzel törölni. [[#nem_elerheto_objektumok_toerlese|lásd lentebb]]
===== Tag törlése =====
* Helyileg:
git tag -d 12345
* Távol:
git push origin :refs/tags/12345
===== Rendszeresen előforduló conflict-ok feloldása =====
git config --local rerere.enabled true
git config --local rerere.autoupdate true
===== Fájlok más helyre mozgatása egy másik repóba a history megtartásával =====
* http://stackoverflow.com/questions/1365541/how-to-move-files-from-one-git-repo-to-another-not-a-clone-preserving-history
- Patchek kigyűjtése:
git log 'from-patch..to-patch' --pretty=email --patch-with-stat --reverse './wanted-folder-and-subfolders' > 'patches'
- Patch-ben lévő elérési útvonalak módosítása
- Módosított patch alkalmazása a másik repón:
git am -3 < 'patches'
===== Karbantartás, takarítás =====
* http://stackoverflow.com/a/28335092/1108919
==== Nem elérhető objektumok törlése ====
git reflog expire --expire=now --all
git gc --aggressive --prune=now
==== Félbehagyott műveletek megszakítása ====
git cherry-pick --abort
git am --abort
git merge --abort
git rebase --abort
==== Lokális változások törlése ====
git reset --hard
git clean -fd
===== Helyreállítás =====
==== Elkevert patch-ek visszaszerzése ====
- Elkevert patch-ek:
git lost-found
gitk $(cd '.git/lost-found/commit' && echo ??*)
- Szükséges patch-ek megjelölése (pl: tag-eléssel, vagy branch létrehozással)
==== Repó sérülés ====
* http://stackoverflow.com/questions/801577/how-to-recover-git-objects-damaged-by-hard-disk-failure
===== Git beszerzése =====
==== Statikus Git ====
* http://en.newinstance.it/2011/02/27/how-to-create-a-statically-linked-version-of-git-binaries/
# let's make sure we have all we need to proceed
sudo apt-get install libexpat1-dev asciidoc libz-dev gettext curl
# let's create the directory to host the built artifacts
sudo mkdir /opt/git-1.7.4.1-static
# we are ready to download and unpack latest version of git sources (last: http://git-scm.com/)
curl http://kernel.org/pub/software/scm/git/git-1.7.4.1.tar.bz2 | tar xvj
cd git-1.7.4.1/
# then compile and install the files in the target directory we created
./configure --prefix=/opt/git-1.7.4.1-static CFLAGS="${CFLAGS} -static" NO_OPENSSL=1 NO_CURL=1
sudo make install
sudo make install-doc
===== SVN to Git =====
- Git repó inicializálása:
git init
- SVN felhasználónév <=> Git committer egyeztetése a ''C:\Users\foo\Desktop\users.txt'' fájlban (kis-, nagybetű érzékeny!):
foobar = Foo Bar
Fooar = Foo Bar
FooBar = Foo Bar
APPLETREE = Apple Tree
- Git config:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[svn-remote "svn"]
noMetadata = 1
url = http://localhost:2080/svn/Devel/MAINLINE
fetch = :refs/remotes/git-svn
[svn]
pathnameencoding = iso-8859-2
authorsfile = d:/Users/foo/Repositories/git/users.txt
-
git svn init 'http://localhost:2080/svn/Devel/MAINLINE' --no-metadata
git svn init 'http://localhost:2080/svn/Test' --no-metadata
git config svn.authorsfile '/c/Users/foo/Desktop/users.txt'
git config svn.pathnameencoding 'cp1252' # Linuxon ne állítsd be!
git svn fetch
rm -r '.git/svn' '.git/refs/remotes/git-svn'
===== Meta infók lecserélése =====
git filter-branch --env-filter '
# bash kód a környezeti változók lecserélésére
' HEAD
==== Módosítható értékek ====
* ''GIT_AUTHOR_NAME''
* ''GIT_AUTHOR_EMAIL''
* ''GIT_AUTHOR_DATE''
* ''GIT_COMMITTER_NAME''
* ''GIT_COMMITTER_EMAIL''
* ''GIT_COMMITTER_DATE''
man git-filter-branch
==== Egyéb egyéb elérhető változók ====
* ''GIT_COMMIT''
* ''GIT_DIR''
* ''GIT_INDEX_FILE''
* ''GIT_OBJECT_DIRECTORY''
* ''GIT_QUIET''
* ''GIT_WORK_TREE''
==== Régi author és committer lecserélése ====
* http://serverfault.com/questions/12373/how-do-i-edit-gits-history-to-correct-an-incorrect-email-address-name/13162#13162
git filter-branch --tag-name-filter 'cat' --env-filter '
oldname="FooBarZ"
oldemail="foobarz@dummy.com"
newname="Foo Bar"
newemail="foo@bar.com"
[ "$GIT_AUTHOR_NAME" == "$oldname" ] && GIT_AUTHOR_NAME="$newname"
[ "$GIT_AUTHOR_EMAIL" == "$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
[ "$GIT_COMMITTER_NAME" == "$oldname" ] && GIT_COMMITTER_NAME="$newname"
[ "$GIT_COMMITTER_EMAIL" == "$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
' -- --all
===== Branch átemelése egy másik repóból =====
* http://stackoverflow.com/a/17864475/1108919
- Álljunk a célrepóba, majd adjuk meg a forrás repó helyét és az átemelni kívánt branch-et:
git pull '../forras-repo' master
===== Rebase a legelső patchel együtt =====
* http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git/2309391#2309391
git rebase --root ...
===== "original" referenciák törlése =====
* az "official way":
git for-each-ref --format='%(refname)' refs/original/ |
xargs -n 1 git update-ref -d
* egyszerűbben:
rm -rf '.git/refs/original'
===== Elérési út manipulációk =====
* https://git-scm.com/docs/git-filter-branch
Ha nem szeretnénk, hogy a git megjegyezze az eredeti állapotot is, használjuk a ''%%--force%%'' kapcsolót.
==== Könyvtár kiemelése egy új branch-re ====
* https://makingsoftware.wordpress.com/2013/02/16/using-git-subtrees-for-repository-separation/
git subtree split --prefix='path/of/code' -b 'destination-branch'
==== Elérési út prefixelése ====
export path_prefix='foo'
git filter-branch --tag-name-filter 'cat' --index-filter '
git ls-files -s |
sed "s>\t\"*>&'"${path_prefix}"'/>" |
GIT_INDEX_FILE="${GIT_INDEX_FILE}.new" git update-index --index-info &&
mv "${GIT_INDEX_FILE}.new" "${GIT_INDEX_FILE}"
' -- --all
==== Könyvtár kiemelése egy új branch-re ====
git subtree split --prefix='path/of/code' -b 'destination-branch'
==== Tetszőleges fájlművelet minden branch-re ====
Pl. az összes fájl és mappa mozgatása egy újonnan létrehozott ''web'' könyvtárba:
git filter-branch --tree-filter '
mkdir -p web
for fso in $(ls -A | grep -Ev '"'"'^(web|\.git)$'"'"')
do
new="web/$(echo "${fso}" | sed '"'"'s>^poc->>'"'"')"
echo "# $fso >> $new"
mv "$fso" "$new"
done
' -- --all
===== Távoli változás ellenőrzése =====
local_commit="`git rev-parse HEAD`"
remote_commit="`git rev-parse @{u}`"
if [ "${local_commit}" == "${remote_commit}" ]; then
echo "No changed"
fi
====== Fixup patch darabolása ======
git add -A && git absorb -b origin/master --force