Git'teki birden fazla komisyonun yazar─▒ ve sahibi ad─▒ ve e-postas─▒ nas─▒l de─či┼čtirilir?


Al─▒nan cevaba git


Okul bilgisayar─▒na basit bir senaryo yaz─▒yordum ve de─či┼čiklikleri Git'e (evde olan bilgisayar─▒mdan klonlanm─▒┼č bir repoda) yap─▒yordum. Birka├ž taahh├╝tten sonra, k├Âk kullan─▒c─▒ olarak i┼č yapt─▒─č─▒m─▒ anlad─▒m.

Bu taahh├╝tlerin yazar─▒n─▒ ismimle de─či┼čtirmenin bir yolu var m─▒?


2255









Cevap say─▒s─▒n─▒ say: 30






Yazar─▒n (veya yorumcunun) de─či┼čtirilmesi, tarihin tamam─▒n─▒ yeniden yazmay─▒ gerektirir. Bu konuda sorun ya┼čarsan─▒z ve buna de─čer oldu─čunu d├╝┼č├╝n├╝yorsan─▒z, git filter ┼čubesine bakmal─▒s─▒n─▒z . K─▒lavuz sayfas─▒, ba┼člaman─▒z i├žin birka├ž ├Ârnek i├žerir. Ayr─▒ca yazar─▒n, yorumcunun, tarihlerin vb. Ad─▒n─▒ de─či┼čtirmek i├žin ortam de─či┼čkenlerini kullanabilece─činizi unutmay─▒n . Git man sayfas─▒n─▒n "Ortam De─či┼čkenleri" b├Âl├╝m├╝ne bak─▒n .

├ľzellikle, t├╝m dallar ve etiketlerin yanl─▒┼č yazar adlar─▒n─▒ ve e-postalar─▒n─▒ bu komutla d├╝zeltebilirsiniz (kaynak: GitHub help ):

 #!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
 

1075







Etkile┼čimli Rebase Kullan─▒m─▒

Yapabilirsin

 git rebase -i -p <some HEAD before all of your bad commits>
 

Ard─▒ndan, t├╝m k├Ât├╝ taahh├╝tlerinizi rebase dosyas─▒nda "edit" olarak i┼čaretleyin. Ayr─▒ca, ilk taahh├╝d├╝n├╝z├╝ de de─či┼čtirmek isterseniz, rebase dosyas─▒nda ilk sat─▒r olarak elle eklemeniz gerekir (di─čer sat─▒rlar─▒n bi├žimini izleyin). O zaman git senden her bir taahh├╝d├╝ de─či┼čtirmeni isterse, yap

  git commit --amend --author "New Author Name <[email protected]>" 
 

d├╝zenleyen veya yaln─▒zca a├ž─▒lan d├╝zenleyiciyi kapat─▒n ve ard─▒ndan

 git rebase --continue
 

rebase devam etmek i├žin.

Buraya ekleyerek edit├Âr├╝ tamamen a├žmay─▒ atlayabilirsiniz; --no-edit b├Âylece komut ┼č├Âyle olacakt─▒r:

 git commit --amend --author "New Author Name <[email protected]>" --no-edit && \
git rebase --continue
 

Tek taahh├╝t

Yorum yapanlar─▒n baz─▒lar─▒n─▒n belirtti─či gibi, yaln─▒zca en son taahh├╝d├╝n├╝ de─či┼čtirmek istiyorsan─▒z, rebase komutu gerekli de─čildir. Sadece yap

  git commit --amend --author "New Author Name <[email protected]>"
 

Bu belirtilen isme yazar de─či┼čecek, ama committer yap─▒land─▒r─▒lm─▒┼č kullan─▒c─▒ya ayarlanacakt─▒r git config user.name ve git config user.email . Al─▒c─▒y─▒ belirledi─činiz bir ┼čeye ayarlamak istiyorsan─▒z, bu hem yazar─▒ hem de al─▒c─▒y─▒ ayarlar:

  git -c user.name="New Author Name" -c [email protected] commit --amend --reset-author
 

Birle┼čtirme Komisyonlar─▒ Hakk─▒nda Not

Orijinal cevab─▒mda ufak bir kusur vard─▒. Ak─▒m HEAD ile sizin aran─▒zda herhangi bir birle┼čme taahh├╝d├╝ varsa <some HEAD before all your bad commits> , git rebase bunlar─▒ d├╝zle┼čtirecektir (ve bu arada, GitHub ├žekme taleplerini kullan─▒rsan─▒z, ge├žmi┼činizde bir tonluk birle┼čtirme komisyonu olacak). Bu, genellikle ├žok farkl─▒ bir tarihe yol a├žabilir (├žift de─či┼čiklikler "yeniden ortaya ├ž─▒kar─▒labildi─činden" olabilir) ve en k├Ât├╝ durumda, git rebase sizden (birle┼čme kararlar─▒nda zaten ├ž├Âz├╝lm├╝┼č olan) zor bir birle┼čme ├žat─▒┼čmalar─▒n─▒ ├ž├Âzmenizi isteme yol a├žabilir . ├ç├Âz├╝m, tarihinizin birle┼čtirme yap─▒s─▒n─▒ koruyacak olan -p bayra─č─▒ kullanmakt─▒r git rebase . Manpage, kullan─▒m─▒ ve sorunlara yol a├žabilece─či git rebase konusunda uyar─▒yor , ancak b├Âl├╝mde "D├╝zenleme taahh├╝tlerini yerine getirme ve taahh├╝t iletilerini yeniden d├╝zenleme" iyi sonu├ž vermeli. -p -i BUGS

-p Yukar─▒daki komuta ekledim . En yeni taahh├╝d├╝ de─či┼čtirdi─činiz durumda, bu sorun de─čil.


1531







Ayr─▒ca ┼čunlar─▒ da yapabilirsiniz:

 git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "[email protected]";
        else
                git commit-tree "[email protected]";
        fi' HEAD
 

Not: Bu komutu Windows komut isteminde kullan─▒yorsan─▒z, " bunun yerine kullanman─▒z gerekir ' :

 git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "[email protected]";
        else
                git commit-tree "[email protected]";
        fi" HEAD
 

582







Bir liner, ancak ├žok kullan─▒c─▒l─▒ bir deponuz varsa dikkatli olun - bu , ayn─▒ (yeni) yazar ve yorumcuya sahip olmak i├žin t├╝m taahh├╝tleri de─či┼čtirecektir .

 git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='[email protected]'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='[email protected]';" HEAD
 

Dize ├žizgi sat─▒rlar─▒ (bash'ta m├╝mk├╝nd├╝r):

 git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='[email protected]'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='[email protected]'
  " HEAD
 

527







Ba┼člat─▒lan bir $ HOME / .gitconfig olmad─▒─č─▒nda ger├žekle┼čir. Bunu ┼ču ┼čekilde d├╝zeltebilirsiniz:

 git config --global user.name "you name"
git config --global user.email [email protected]
git commit --amend --reset-author
 

git s├╝r├╝m 1.7.5.4 ile test edilmi┼čtir


216







Tek bir taahh├╝t i├žin:

 git commit --amend --author="Author Name <[email protected]>"
 

(avukat─▒n cevab─▒ndan al─▒nt─▒)


182







Sadece ilk birka├ž komisyonun yazarlar─▒n─▒n k├Ât├╝ olmas─▒ durumunda, bunu a┼ča─č─▒daki gibi komutu ve taahh├╝d├╝ git rebase -i kullanarak yapabilirsiniz : exec --amend

 git rebase -i HEAD~6 # as required
 

D├╝zenlenebilir komisyon listesi size sunar:

 pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2
 

Ard─▒ndan exec ... --author="..." , hatal─▒ yazarlar─▒n bulundu─ču t├╝m sat─▒rlardan sonra sat─▒r ekleyin :

 pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <[email protected]>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <[email protected]>" -C HEAD
 

edit├Ârden kaydedip ├ž─▒k─▒n (├žal─▒┼čt─▒rmak i├žin).

Bu ├ž├Âz├╝m di─čerlerine g├Âre yazmak daha uzun olabilir, ancak olduk├ža kontrol edilebilir - Neyin i┼če yarad─▒─č─▒n─▒ kesin olarak biliyorum.

─░lham i├žin @asmeurer te┼čekk├╝rler.


171







Github a┼ča─č─▒daki kabuk beti─či olan ho┼č bir ├ž├Âz├╝me sahiptir :

 #!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
 

110







Belge anlat─▒ld─▒─č─▒ gibi, tarihin yeniden yaz─▒lmas─▒ tehlikelidir ve di─čer insanlar─▒n depolar─▒n─▒ k─▒racakt─▒r.

Ancak bunu ger├žekten yapmak istiyorsan─▒z ve bir bash ortam─▒ndaysan─▒z (Linux'ta sorun de─čil, Windows'ta, git y├╝klemesi ile sa─članan git bash'─▒ kullanabilirsiniz), git filter-dal─▒n─▒ kullan─▒n :

 git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = [email protected] ];
    then [email protected];
  fi;
export GIT_AUTHOR_EMAIL'
 

─░┼čleri h─▒zland─▒rmak i├žin, yeniden yazmak istedi─činiz bir dizi de─či┼čiklik belirleyebilirsiniz:

 git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = [email protected] ];
    then [email protected];
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD
 

80







Ba┼čka bir yazardan ayr─▒lmam─▒┼č bir taahh├╝d├╝ devral─▒rken, bununla ba┼č etmenin kolay bir yolu var.

git commit --amend --reset-author


48







Bunu takma ad olarak kullanabilirsiniz, b├Âylece:

 git change-commits GIT_AUTHOR_NAME "old name" "new name"
 

veya son 10 taahh├╝t i├žin:

 git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" HEAD~10..HEAD
 

~ / .Gitconfig dosyas─▒na ekleyin:

 [alias]
    change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" [email protected]; }; f "
 

Kaynak: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Umar─▒m faydal─▒d─▒r.


44







Bu, Brian'─▒n s├╝r├╝m├╝n├╝n daha ayr─▒nt─▒l─▒ bir s├╝r├╝m├╝d├╝r:

Yazar ve yorumcuyu de─či┼čtirmek i├žin, bunu (bash'ta m├╝mk├╝n olan dizgilerdeki sat─▒r ba┼člar─▒ ile) yapabilirsiniz:

 git filter-branch --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all
 

Bu hatalardan birini alabilirsiniz:

  1. Ge├žici dizin zaten var
  2. Refs / original ile ba┼člayan referanslar zaten var
    (bu, daha ├Ânce depoda ba┼čka bir filtre dal─▒n─▒n ├žal─▒┼čt─▒r─▒ld─▒─č─▒ ve ard─▒ndan orijinal dal referans─▒n─▒n refs / original'da yedeklendi─či anlam─▒na gelir )

Bu hatalara ra─čmen ko┼čuyu zorlamak istiyorsan─▒z --force bayra─č─▒ ekleyin :

 git filter-branch --force --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all
 

-- --all Se├ženek hakk─▒nda k├╝├ž├╝k bir a├ž─▒klama gerekebilir: Filtre ┼čubesinin t├╝m referanslardaki (t├╝m ┼čubeleri i├žeren) t├╝m revizyonlar ├╝zerinde ├žal─▒┼čmas─▒n─▒ sa─člar . Bu, ├Ârne─čin, etiketlerin de yeniden yaz─▒ld─▒─č─▒ ve yeniden yaz─▒lm─▒┼č dallarda g├Âr├╝lebildi─či anlam─▒na gelir.

Bunun yerine yayg─▒n bir "hata" kullanmakt─▒r HEAD ; bu, yaln─▒zca ge├žerli daldaki t├╝m d├╝zeltmeleri filtrelemek anlam─▒na gelir . Ve sonra, yeniden yaz─▒lan dalda hi├žbir etiket (veya ba┼čka referanslar) bulunmaz.


38







  1. ko┼čmak git rebase -i <sha1 or ref of starting point>
  2. ile de─či┼čtirmek istedi─činiz t├╝m taahh├╝tleri i┼čaretleyin edit (veya e )
  3. T├╝m taahh├╝tleri i┼čleme koyana kadar a┼ča─č─▒daki iki komutu tekrarlay─▒n:

    git commit --amend --reuse-message=HEAD --author="New Author <[email protected]>" ; git rebase --continue

Bu, di─čer t├╝m taahh├╝t bilgilerini tutacakt─▒r (tarihler dahil). --reuse-message=HEAD Se├ženek ba┼člat─▒lmas─▒ gelen mesaj edit├Âr├╝ engeller.


23







Etiketleri ve t├╝m dallar─▒ da i├žeren t├╝m bir depo i├žin yazar─▒ yeniden yazmak i├žin a┼ča─č─▒dakileri kullan─▒yorum:

 git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='New name';
  export GIT_AUTHOR_EMAIL='New email'
" -- --all
 

Ard─▒ndan, filtre dal─▒n─▒n MAN sayfas─▒nda a├ž─▒kland─▒─č─▒ gibi, yedeklenen t├╝m orijinal referanslar─▒ kald─▒r─▒n filter-branch (ilk ├Ânce bu y─▒k─▒c─▒, yedeklenir):

 git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d
 

22







Basit bir yutturmaca ile ├žal─▒┼čan bu ├ž├Âz├╝m├╝ uyarlad─▒m author-conv-file (format git-cvsimport i├žin olanla ayn─▒ ). T├╝m kullan─▒c─▒lar─▒ author-conv-file t├╝m bran┼člarda tan─▒mland─▒─č─▒ ┼čekilde de─či┼čtirerek ├žal─▒┼č─▒r .

Bunu cvs2git , depolar─▒m─▒z─▒ cvs'den git'e ge├žirmek i├žin birlikte kulland─▒k .

yani ├Ârnek author-conv-file

 john=John Doe <[email protected]>
jill=Jill Doe <[email protected]>
 

Senaryo:

  #!/bin/bash

 export $authors_file=author-conv-file

 git filter-branch -f --env-filter '

 get_name () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=\(.*\) <.*>$/\1/"
 }

 get_email () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=.* <\(.*\)>$/\1/"
 }

 GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
     GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
     GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
     export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
     export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
 ' -- --all
 

21







Bir tek komut ge├žen N kaydedilmesini yazar─▒n─▒ de─či┼čtirmek i├žin:

 git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"
 

NOTLAR

  • --no-edit bayrak markalar─▒ emin git commit --amend ekstra onay sormuyor
  • kulland─▒─č─▒n─▒zda git rebase -i , el nerede yazar de─či┼čtirmek i├žin kaydedilmesini se├žebilirsiniz,

d├╝zenledi─činiz dosya ┼č├Âyle g├Âr├╝n├╝r:

 pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
 

Ard─▒ndan, yazar─▒n yerini de─či┼čtirmek istedi─činiz yeri g├Ârmek i├žin baz─▒ sat─▒rlar─▒ de─či┼čtirebilirsiniz. Bu size otomasyon ve kontrol aras─▒nda g├╝zel bir orta yol sa─člar: ├žal─▒┼čacak ad─▒mlar─▒ g├Âr├╝rs├╝n├╝z ve bir kez tasarruf etti─činizde her ┼čey bir kerede uygulan─▒r.


19







Sunulan s├╝r├╝mleri agresif bulman─▒n yolunu buldum, ├Âzellikle de di─čer geli┼čtiricilerin yamalar─▒n─▒ uygularsan─▒z, bu esasen kodlar─▒n─▒ ├žalacakt─▒r.

A┼ča─č─▒daki s├╝r├╝m t├╝m dallarda ├žal─▒┼č─▒r ve bunu ├Ânlemek i├žin yazar─▒ ve at─▒c─▒y─▒ ayr─▒ ayr─▒ de─či┼čtirir.

T├╝m se├ženek i├žin leif81 i├žin Kudos.

 #!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<[email protected]>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<[email protected]>";
fi
' -- --all
 

18







  1. De─či┼čim taahh├╝t author name & email taraf─▒ndan Amend daha sonra yerine old-commit with new-one :

     $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <[email protected]>" # change the author name and email
    
    $ git replace <old-commit-hash> <new-commit-hash>      # replace the old commit by new one
    $ git filter-branch -- --all                           # rewrite all futures commits based on the replacement                   
    
    $ git replace -d <old-commit-hash>     # remove the replacement for cleanliness 
    $ git push -f origin HEAD              # force push 
     
  2. Ba┼čka bir yol Rebasing :

     $ git rebase -i <good-commit-hash>      # back to last good commit
    
    # Editor would open, replace 'pick' with 'edit' before the commit want to change author
    
    $ git commit --amend --author="author name <[email protected]>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
     

18







┼×unu s├Âylemeliyim ki, tek sorun yazar / e-postan─▒n normalden farkl─▒ olmas─▒ durumunda, bu bir sorun de─čildir. Do─čru d├╝zeltme, .mailmap dizinin taban─▒nda ve benzeri sat─▒rlar─▒ olan bir dosya olu┼čturmakt─▒r.

 Name you want <email you want> Name you don't want <email you don't want>
 

Ve bundan sonra, gibi komutlar git shortlog bu iki ismi ayn─▒ g├Âreceklerdir (├Âzellikle s├Âylememelerini s├Âylemedi─činiz s├╝rece). Daha fazla bilgi i├žin http://schacon.github.com/git/git-shortlog.html adresine bak─▒n .

Bu, buradaki di─čer t├╝m ├ž├Âz├╝mlerin avantaj─▒na sahiptir; ge├žmi┼či yeniden yazmak zorunda kalmazs─▒n─▒z; bu, bir yukar─▒ ak─▒┼č─▒n─▒z varsa sorunlara neden olabilir ve her zaman yanl─▒┼čl─▒kla veri kaybetmek i├žin iyi bir yoldur.

Elbette, kendin gibi bir ┼čey yapt─▒ysan ve ger├žekten ba┼čkas─▒ olmal─▒ ve bu noktada tarihi yeniden yazmay─▒ d├╝┼č├╝nm├╝yorsan, b├╝y├╝k yazar─▒n de─či┼čtirilmesi muhtemelen atfetme ama├žlar─▒ i├žin iyi bir fikirdir (bu durumda seni benim ad─▒ma y├Ânlendiririm) di─čer cevap burada).


16







Bu deponun sadece kullan─▒c─▒ iseniz, olabilir tarihi yeniden kullanarak git filter-branch (olarak svick yazd─▒m ) veya git fast-export / git fast-import art─▒ filtre (ba┼čvurulan makalesinde anlat─▒ld─▒─č─▒ gibi komut docgnome cevap ) veya etkile┼čimli Rebase . Ancak bunlardan biri, ilk de─či┼čtirilen taahh├╝tten sonraki revizyonlar─▒ de─či┼čtirecektir; bu, de─či┼čikliklerinizi ┼čubenize yeniden yazmadan ├Ânce yapan herkes i├žin sorun anlam─▒na gelir.

KURTARMA

Di─čer geli┼čtiriciler ├žal─▒┼čmalar─▒n─▒ yeniden yazma s├╝r├╝m├╝ne dayanmazsa, en basit ├ž├Âz├╝m yeniden klonlamakt─▒r (yeniden klonlamak).

Alternatif olarak, git rebase --pull depolar─▒nda herhangi bir de─či┼čiklik olmasayd─▒ ileriye do─čru h─▒zl─▒ bir ┼čekilde ileri gidebileceklerini deneyebilirler ya da ┼čubelerini yeniden yaz─▒lan komisyonlar─▒n ├╝zerine yeniden a├žabilirler (yeniden yazma i┼čleminin sonsuza dek devam edece─či gibi birle┼čtirmek istemiyoruz). Bunlar─▒n hepsi i┼č yapmad─▒klar─▒n─▒ varsayarsak; git stash Aksi takdirde de─či┼čiklikleri saklamak i├žin kullan─▒n .

Di─čer geli┼čtiriciler ├Âzellik dallar─▒ kullan─▒yorsa ve / veya git pull --rebase ├žal─▒┼čm─▒yorsa, ├Ârne─čin yukar─▒ ak─▒┼č kurulmam─▒┼č oldu─čundan , ├žal─▒┼čmalar─▒n─▒ yeniden yazma sonras─▒ komisyonlar─▒n ├╝zerine yeniden derlemeleri gerekir. ├ľrne─čin, yeni de─či┼čiklikler getirdikten hemen sonra ( git fetch ), master / ├žatal─▒na dayal─▒ bir dal i├žin origin/master birinin ├žal─▒┼čt─▒r─▒lmas─▒ gerekir.

 $ git rebase --onto origin/master origin/[email protected]{1} master
 

─░┼čte origin/[email protected]{1} yeniden yazma ├Âncesi durumu (getirmeden ├Ânce), gitrevisions .


Alternatif ├ž├Âz├╝m, 1.6.5 s├╝r├╝m├╝nden beri Git'te mevcut olan refs / replace / mekanizmas─▒n─▒ kullanmak olabilir . Bu ├ž├Âz├╝mde yanl─▒┼č e-postaya sahip taahh├╝tler i├žin de─či┼čtirmeler sa─člar; ref (gibi bir ┼čey 'yerine' ├žeker sonra herkes fetch = +refs/replace/*:refs/replace/* uygun bir yerde refspec onlar─▒n .git/config ┼čeffaf alaca─č─▒ de─či┼čtirmeler) ve eski kaydedilmesini g├Ârecekti bu ref getirme olmayanlar.

Prosed├╝r b├Âyle bir ┼čey gider:

  1. Yanl─▒┼č bir e-posta ile t├╝m taahh├╝tleri bulun, ├Ârne─čin

     $ git log [email protected] --all
     
  2. Her yanl─▒┼č i┼č i├žin, yerine yeni bir i┼č olu┼čtur ve nesne veritaban─▒na ekle

     $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/[email protected]\.email/[email protected]/g' > tmp.txt
    $ git hash-object -t commit -w tmp.txt
    <ID of corrected commit>
     
  3. Art─▒k nesne veritaban─▒ndaki taahh├╝d├╝ d├╝zeltti─čine g├Âre, git git replace komutunu kullanarak d├╝zeltmeyi otomatik olarak ve saydam olarak yanl─▒┼č i┼člemi de─či┼čtirmesini s├Âylemelisiniz :

     $ git replace <ID of wrong commit> <ID of corrected commit>
     
  4. Son olarak, bu i┼člemin ba┼čar─▒l─▒ olup olmad─▒─č─▒n─▒ kontrol etmek i├žin t├╝m de─či┼čiklikleri listele

     $ git replace -l
     

    ve de─či┼čiklik olup olmad─▒─č─▒n─▒ kontrol edin

     $ git log [email protected] --all
     

Elbette bu prosed├╝r├╝ otomatikle┼čtirebilirsiniz ... peki, git replace (hen├╝z) parti moduna sahip olmayan kullan─▒m─▒ haricinde , bunun i├žin kabuk d├Âng├╝s├╝n├╝ kullanman─▒z veya ÔÇťelleÔÇŁ de─či┼čtirmeniz gerekebilir.

TEST ED─░LMED─░! YMMV.

refs/replace/ Mekanizmay─▒ kullan─▒rken baz─▒ sert k├Â┼čelerle kar┼č─▒la┼čabilece─činizi unutmay─▒n : yeni ve hen├╝z ├žok iyi test edilmemi┼č .


9







Bunu yapman─▒n en h─▒zl─▒ ve kolay yolu git rebase'in --exec arg├╝man─▒n─▒ kullanmakt─▒r:

 git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'
 

Bu ┼čuna benzeyen bir yap─▒lacaklar listesi olu┼čturacakt─▒r:

 pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...
 

ve bu, y├╝zlerce i┼č taahh├╝d├╝n├╝z oldu─čunda i┼če yarayacak olan otomatik olarak ├žal─▒┼čacakt─▒r.


9







E─čer d├╝zeltme istedi─činiz kaydedilmesini son olanlar─▒ ve bunlardan sadece birka├ž iseniz, bir arada kullanabilirsiniz git reset ve git stash do─čru ismi ve e-posta yap─▒land─▒rmadan sonra tekrar i┼člemeye geri d├Ânmek i├žin.

S─▒ralama ┼č├Âyle bir ┼čey olacak (2 yanl─▒┼č karar i├žin, beklemede de─či┼čiklik yok):

 git config user.name <good name>
git config user.email <good email>
git reset HEAD^
git stash
git reset HEAD^
git commit -a
git stash pop
git commit -a
 

6







EGlip ile Eclipse kullan─▒yorsan─▒z, olduk├ža kolay bir ├ž├Âz├╝m var.
Varsay─▒m: Ge├žersiz bir kullan─▒c─▒ nedeniyle uzaktaki bir 'ana' dal─▒na itilemeyen 'local_master_user_x' yerel ┼čubesinde taahh├╝tte bulunuyorsunuz.

  1. Uzak ┼čubeyi 'master' olarak sat─▒n al─▒n
  2. 'Local_master_user_x' i├žinde de─či┼čiklik i├žeren projeleri / klas├Ârleri / dosyalar─▒ se├žin
  3. Sa─č t─▒klay─▒n - ─░le De─či┼čtir - ┼×ube - 'local_master_user_x'
  4. Bu de─či┼čiklikleri tekrar yap─▒n, bu kez do─čru kullan─▒c─▒ olarak ve yerel ┼čubeye 'master' girin
  5. Uzaktaki 'master' d├╝─čmesine bas

5







Etkile┼čimli rebase kullanarak, de─či┼čtirmek istedi─činiz her i┼člemden sonra bir d├╝zeltme komutu ekleyebilirsiniz. ├ľrne─čin:

 pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
 

5


2013-02-26





Git'in biri m├╝┼čteri (de─či┼čikli─či yapan ki┼či) ve di─čeri yazar i├žin (de─či┼čikli─či yazan ki┼či ) olmak ├╝zere iki farkl─▒ e-posta adresi saklad─▒─č─▒n─▒ unutmay─▒n .

├ťretici bilgileri ├žo─ču yerde g├Âsterilmez, ancak bunu g├Ârebilir git log -1 --format=%cn,%ce (veya belirli bir taahh├╝d├╝ belirtmek show yerine kullanabilirsiniz log ).

Son taahh├╝d├╝n├╝z├╝n yazar─▒n─▒ de─či┼čtirmek kadar basit olsa da git commit --amend --author "Author Name <[email protected]>" , ayn─▒ bilgiyi yap─▒mc─▒ bilgisinde yapacak tek bir g├Âmlek ya da arg├╝man yoktur.

├ç├Âz├╝m, kullan─▒c─▒ bilgilerinizi (ge├žici olarak veya de─čil) de─či┼čtirmek, ard─▒ndan i┼čletmeciyi mevcut bilgilerinizle g├╝ncelleyecek olan taahh├╝d├╝ de─či┼čtirmektir:

 git config user.email [email protected] 
git commit --amend
 

5







Bug├╝n, yazar ad─▒ndaki bir UTF8 karakterinin derleme sunucusunda sorun yaratt─▒─č─▒ bir sorunla kar┼č─▒la┼čt─▒k, bu nedenle bunu d├╝zeltmek i├žin ge├žmi┼či yeniden yazmak zorunda kald─▒k. At─▒lan ad─▒mlar vard─▒:

Ad─▒m 1: Buradaki talimatlara g├Âre, gelecekteki t├╝m taahh├╝tler i├žin kullan─▒c─▒ ad─▒n─▒z─▒ git olarak de─či┼čtirin: https://help.github.com/articles/setting-your-username-in-git/

Ad─▒m 2: A┼ča─č─▒daki bash beti─čini ├žal─▒┼čt─▒r─▒n:

 #!/bin/sh

REPO_URL=ssh://path/to/your.git
REPO_DIR=rewrite.tmp

# Clone the repository
git clone ${REPO_URL} ${REPO_DIR}

# Change to the cloned repository
cd ${REPO_DIR}

# Checkout all the remote branches as local tracking branches
git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout

# Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="New Me"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
fi
' --tag-name-filter cat -- --branches --tags

# Force push the rewritten branches + tags to the remote
git push -f

# Remove all knowledge that we did something
rm -rf ${REPO_DIR}

# Tell your colleagues to `git pull --rebase` on all their local remote tracking branches
 

H─▒zl─▒ genel bak─▒┼č: Deponuzu ge├žici bir dosyaya g├Âz at─▒n, t├╝m uzak dallar─▒ kontrol edin, ge├žmi┼či yeniden yazacak olan beti─či ├žal─▒┼čt─▒r─▒n, yeni durumu zorlay─▒n ve t├╝m meslekta┼člar─▒n─▒za de─či┼čiklikleri almak i├žin yeniden bir ├žekme i┼člemi yapmas─▒n─▒ s├Âyleyin.

Bunu OS X'te ├žal─▒┼čt─▒rmakta sorun ya┼čad─▒k, ├ž├╝nk├╝ bir ┼čekilde i┼člem sonland─▒rma mesajlar─▒nda sat─▒r sonlar─▒n─▒ berbat etti, bu y├╝zden daha sonra bir Linux makinesinde tekrar ├žal─▒┼čt─▒rmak zorunda kald─▒k.


5







Senin sorunun ger├žekten yayg─▒n. Bkz. " Git'teki Yazarlar Listesini D├╝zeltmek i├žin Posta Haritas─▒n─▒ Kullanma "

Sadelik ad─▒na, s├╝reci kolayla┼čt─▒rmak i├žin bir senaryo haz─▒rlad─▒m: git-changemail

Bu beti─či yolunuza koyduktan sonra, a┼ča─č─▒daki gibi komutlar verebilirsiniz:

  • Mevcut daldaki yazar e┼čle┼čmelerini de─či┼čtir

     $ git changemail -a [email protected] -n newname -m [email protected]
     
  • <branch> ve <branch2> ├╝zerindeki yazar ve yorumcu e┼čle┼čmelerini de─či┼čtirin. Ge├ži┼č -f filtresi-dal─▒na yedekleri yeniden izin vermek

     $ git changemail -b [email protected] -n newname -m [email protected] -- -f &lt;branch> &lt;branch2>
     
  • Depodaki mevcut kullan─▒c─▒lar─▒ g├Âster

     $ git changemail --show-both
     

Bu arada, de─či┼čikliklerinizi yapt─▒ktan sonra, yedeklemeyi filtre dal─▒ndan: git-backup-clean ile temizleyin.


5







Ben de ├Ârne─čimi eklemek istiyorum. Verilen parametre ile bir bash_function olu┼čturmak istiyorum .

Bu nane-linux 17.3 ├žal─▒┼č─▒r

 # $1 => email to change, $2 => new_name, $3 => new E-Mail

function git_change_user_config_for_commit {

 # defaults
 WRONG_EMAIL=${1:-"[email protected]"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"[email protected]"}

 git filter-branch -f --env-filter "
  if [ \$GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_COMMITTER_NAME='$NEW_NAME'
    export GIT_COMMITTER_EMAIL='$NEW_EMAIL'
  fi
  if [ \$GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_AUTHOR_NAME='$NEW_NAME'
    export GIT_AUTHOR_EMAIL='$NEW_EMAIL'
  fi
 " --tag-name-filter cat -- --branches --tags;
}
 

3







Bunu dene. Yukar─▒da belirtilen ile ayn─▒ ┼čekilde ├žal─▒┼č─▒r, ancak etkile┼čimli olarak.

 bash <(curl -s  https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)
 

Referans: https://github.com/majdarbash/git-author-change-script


3







E─čer bu reponun tek kullan─▒c─▒s─▒ysan─▒z veya di─čer kullan─▒c─▒lar i├žin repoyu k─▒rma konusunda umursam─▒yorsan─▒z, evet. E─čer bu taahh├╝tleri zorlad─▒ysan─▒z ve ba┼čkalar─▒n─▒n depolar─▒na girmeyi umursan─▒z olmad─▒─č─▒ s├╝rece hay─▒r, ba┼čka bir yerin onlara eri┼čebilece─či yerlerde var olurlar. Sorun, bu taahh├╝tleri de─či┼čtirerek, farkl─▒ taahh├╝tler olarak muamele edilmelerine neden olacak yeni SHA'lar ├╝retmeniz olacakt─▒r. Bu de─či┼čtirilen taahh├╝tleri yerine getirmeye ├žal─▒┼čan bir ba┼čkas─▒ oldu─čunda, tarih farkl─▒ ve kaboom.

Bu sayfa http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html nas─▒l yap─▒laca─č─▒n─▒ a├ž─▒klar. (Bunu hi├ž denemedim bu y├╝zden YMMV)


2



─░lgili yay─▒nlar


Belirli bir taahh├╝t i├žin taahh├╝t yazar─▒ nas─▒l de─či┼čtirilir?

Bir iOS uygulamas─▒n─▒n ad─▒ nas─▒l de─či┼čtirilir?

Lollipop'taki en yeni Chrome s├╝r├╝m├╝nde ba┼čl─▒k ├žubu─čunun ve adres ├žubu─čunun rengini nas─▒l de─či┼čtirebilirim?

Birden ├žok dosyada bir dize aramak ve Powershell'deki dosyalar─▒n isimlerini d├Ând├╝rmek nas─▒l?

En b├╝y├╝k kth eleman─▒, n (O) 'da s─▒ralanmam─▒┼č uzunluk dizisinde nas─▒l bulunur?

Gezinme tabanl─▒ bir uygulamada Push ve Pop animasyonlar─▒ nas─▒l de─či┼čtirilir

Xcode'da aktif ┼čeman─▒n ad─▒ nas─▒l de─či┼čtirilir?

Github'da bir ├Âzyenin ismini nas─▒l de─či┼čtirebilirim?

G├Ânderenin ad─▒ veya e-posta adresi nas─▒l de─či┼čtirilir?

Git'teki bir etiketten beri sadece isimleri ve isimleri nas─▒l g├Âsterebilirim?

Etiketle ilgili di─čer sorular [git]


PostgreSQL'de tablolar─▒ g├Âster

Dizi ├Â─čelerini JavaScript'te silme - vs splice sil

Bir JavaScript dizisini nas─▒l rastgele (kar─▒┼čt─▒rmak)?

Her gruptaki son kayd─▒n al─▒nmas─▒ - MySQL

Ge├žersiz bir uzak dal referans─▒n─▒ Git'ten nas─▒l kald─▒r─▒rs─▒n─▒z?

Hangi dizginin bir dizeyle bitece─čini <a> se├žin

Belirli bir s─▒n─▒fa veya ├Âzelli─če sahip OLMAYAN elemanlar─▒ se├žerek bir CSS se├žicisi yazabilir miyim?

Desteklenmeyen major.minor s├╝r├╝m 52.0 [yinelenen]

Dizinleri grep -R'den nas─▒l hari├ž tutabilirim?

NULL, C# C genel bir y├Ântemden nas─▒l d├Ânebilirim?