Tartalomjegyzék

Git

Új, független ág létrehozása

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. lásd lentebb

Tag törlése

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

  1. Patchek kigyűjtése:
    git log 'from-patch..to-patch' --pretty=email --patch-with-stat --reverse './wanted-folder-and-subfolders' > 'patches'
  2. Patch-ben lévő elérési útvonalak módosítása
  3. Módosított patch alkalmazása a másik repón:
    git am -3 < 'patches'

Karbantartás, takarítás

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

  1. Elkevert patch-ek:
    git lost-found
     
    gitk $(cd '.git/lost-found/commit' && echo ??*)
  2. Szükséges patch-ek megjelölése (pl: tag-eléssel, vagy branch létrehozással)

Repó sérülés

Git beszerzése

Statikus Git

# 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

  1. Git repó inicializálása:
    git init
  2. SVN felhasználónév ⇔ Git committer egyeztetése a C:\Users\foo\Desktop\users.txt fájlban (kis-, nagybetű érzékeny!):
    users.txt
    foobar = Foo Bar <foo.barm@gmail.com>
    Fooar = Foo Bar <foo.barm@gmail.com>
    FooBar = Foo Bar <foo.barm@gmail.com>
    APPLETREE = Apple Tree <applet@gmail.com>
  3. Git config:
    .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
  4. 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

man git-filter-branch

Egyéb egyéb elérhető változók

Régi author és committer lecserélése

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

  1. Á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

git rebase --root ...

"original" referenciák törlése

Elérési út manipulációk

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

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