====== 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