Git හි බහු කමිටු වල කර්තෘ සහ කැපකරුගේ නම සහ විද්‍යුත් තැපෑල වෙනස් කරන්නේ කෙසේද?


2399

මම පාසැල් පරිගණකයේ සරල පිටපතක් ලියමින් සිටි අතර, Git හි වෙනස්කම් සිදු කරමින් සිටියෙමි (මගේ පෙන්ඩ්‍රයිව් එකේ තිබූ රෙපෝ එකක, මගේ පරිගණකයෙන් නිවසේ සිට ක්ලෝන කරන ලදි). කොමිස් කිහිපයකින් පසුව මට වැටහුණා මම මූල පරිශීලකයා ලෙස දේවල් කරන බව.

මෙම කර්තව්‍යයන්ගේ කතුවරයා මගේ නමට වෙනස් කිරීමට ක්‍රමයක් තිබේද?


13
ප්‍රශ්නය: git filter-branch භාවිතා කිරීමෙන් පෙර ටැග්, අනුවාද සහ වස්තු සඳහා SHA1 ආරක්ෂා වේ ද? නැතහොත් කර්තෘගේ නම බලය වෙනස් කිරීම සම්බන්ධිත SHA1 ද වෙනස් කරයිද?
ඇන්ඩිල්

36
හැෂ් ඔව් වෙනස් වේ
ලබා ගත

3
පැහැදිලිවම, මම කුඩා පිටපතක් නිර්මාණය කළෙමි. gist.github.com/tripleee/16767aa4137706fd896c
ත්‍රිත්ව

2
@impinball ප්‍රශ්නයේ වයස කිසිසේත්ම අදාළ නොවේ. නව අනුපිටපත් ප්‍රශ්නයක් සෑදීම ප්‍රශ්නයක් නොවේ. මෙම විශේෂිත පිළිතුර ඉල්ලා සිටින ප්‍රශ්නයක් මට නිර්මාණය කළ හැකි යැයි මම සිතමි. මෙහි Git ප්‍රශ්න හිඟයක් ඇති බවක් නොවේ ... කෙසේ හෝ මට උදව් කිරීමට ලැබීම සතුටක්.
ත්‍රිත්ව

8
GitHub සඳහා මේ සඳහා විශේෂ පිටපතක් ඇත: help.github.com/articles/changing-author-info
Timur Berikovich

Answers:


1222

මෙම පිළිතුර භාවිතා කරයි git-filter-branch, ඒ සඳහා ලේඛනය දැන් මෙම අනතුරු ඇඟවීම ලබා දෙයි:

git filter-branch හි අන්තරායන් රාශියක් ඇති අතර එමඟින් අපේක්ෂිත ඉතිහාසය නැවත ලිවීමේ පැහැදිලි නොවන මැන්ග්ලිං නිපදවිය හැකිය (සහ එවැනි දුර්වල ක්‍රියාකාරිත්වයක් ඇති බැවින් එවැනි ගැටළු විමර්ශනය කිරීමට ඔබට සුළු කාලයක් ඉතිරි කළ හැකිය). මෙම ආරක්ෂාව සහ කාර්යසාධන ගැටළු පසුගාමීව අනුකූලව විසඳිය නොහැකි අතර එහි භාවිතය නිර්දේශ නොකරයි. කරුණාකර git filter-repo වැනි විකල්ප ඉතිහාස පෙරහන් මෙවලමක් භාවිතා කරන්න . ඔබට තවමත් git filter-branch භාවිතා කිරීමට අවශ්‍ය නම්, කරුණාකර පෙරහන් ශාඛාවේ බිම් බෝම්බ ගැන දැන ගැනීමට ආරක්ෂිතව (සහ කාර්යසාධනය ) කියවා , පසුව එහි ලැයිස්තුගත කර ඇති බොහෝ උපද්‍රවයන් සාධාරණ ලෙස හැකි තරම් වළක්වා ගන්න.

කතුවරයා (හෝ කැප කරන්නා) වෙනස් කිරීම සඳහා ඉතිහාසය නැවත ලිවීම අවශ්‍ය වේ. ඔබ ඒ සමඟ හොඳින් කටයුතු කර එය වටිනවා යැයි සිතන්නේ නම් ඔබ git filter-branch පරීක්ෂා කළ යුතුය . ඔබ ආරම්භ කිරීම සඳහා මෑන් පිටුවට උදාහරණ කිහිපයක් ඇතුළත් වේ. කතුවරයාගේ නම, කැප කරන්නා, දිනයන් යනාදිය වෙනස් කිරීමට ඔබට පරිසර විචල්‍යයන් භාවිතා කළ හැකි බව සලකන්න - git man පිටුවේ “පරිසර විචල්‍යතා” කොටස බලන්න .

මෙම විධානය සමඟින් ඔබට සියලුම ශාඛා හා ටැග් සඳහා වැරදි කතුවරුන්ගේ නම් සහ ඊමේල් සවි කළ හැකිය (මූලාශ්‍රය: GitHub help ):

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
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

614
ගිතුබ්ට එම උදවු සඳහා පොදු පිටපතක් ඇත. Github.com/articles/changing-author-info සහ එය විශිෂ්ට ලෙස ක්‍රියා කරයි!
defvol

34
ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමෙන් පසු ඔබට "git update-ref -d refs / original / refs / head / master" ක්‍රියාත්මක කිරීමෙන් උපස්ථ ශාඛාව ඉවත් කළ හැකිය.
ඩීආර්

7
drodowi, එය මගේ සියලු කැපවීම් අනුපිටපත් කරයි.
රෆායෙල් බැරෝස්

6
Af රෆායෙල්බාරෝස් කතුවරයාගේ තොරතුරු (ඉතිහාසයේ වෙනත් ඕනෑම දෙයක් මෙන්) කැපවීමේ ෂා යතුරේ කොටසකි. ඉතිහාසයේ කිසියම් වෙනසක් සිදුවුවහොත් එය නැවත සිදු කිරීමකි. එබැවින් හවුල් ගබඩාවක නැවත ලිවීම හෝ සියලු පරිශීලකයින් ඒ පිළිබඳව දැනුවත්ව සිටින බවට වග බලා ගන්න ...
ජොහැන්නස්

20
භාවිතයෙන් විසඳා ඇතgit push --force --tags origin HEAD:master
mcont

1579

සටහන: මෙම පිළිතුර SHA1s වෙනස් කරයි, එබැවින් එය දැනටමත් තල්ලු කර ඇති ශාඛාවක් මත භාවිතා කිරීමට සැලකිලිමත් වන්න. ඔබට අවශ්‍ය වන්නේ නමක අක්ෂර වින්‍යාසය නිවැරදි කිරීමට හෝ පැරණි විද්‍යුත් තැපෑලක් යාවත්කාලීන කිරීමට නම්, ඉතිහාසය නැවත ලිවීමකින් තොරව මෙය කිරීමට git ඔබට ඉඩ දෙයි .mailmap. මගේ අනෙක් පිළිතුර බලන්න .

අන්තර් ක්‍රියාකාරී ප්‍රතිස්ථාපනය භාවිතා කිරීම

ඔබට කළ හැකිය

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

ඉන්පසු ඔබගේ සියලු නරක ක්‍රියාවන් නැවත සංස්කරණය කිරීමේ ගොනුවේ "සංස්කරණය" ලෙස සලකුණු කරන්න. ඔබේ පළමු බැඳීමද වෙනස් කිරීමට ඔබට අවශ්‍ය නම්, ඔබ එය ප්‍රතිවිකුණුම් ගොනුවේ පළමු පේළිය ලෙස අතින් එකතු කළ යුතුය (අනෙක් පේළි වල ආකෘතිය අනුගමනය කරන්න). එක් එක් බැඳීම සංශෝධනය කරන්නැයි git ඔබෙන් ඉල්ලා සිටින විට, කරන්න

 git commit --amend --author "New Author Name <email@address.com>" 

විවෘත කරන සංස්කාරකය සංස්කරණය කරන්න හෝ වසා දමන්න, ඉන්පසු කරන්න

git rebase --continue

නැවත ආරම්භ කිරීම සඳහා.

එකතු --no-edit කිරීමෙන් ඔබට සංස්කාරකය විවෘත කිරීම සම්පූර්ණයෙන්ම මඟ හැරිය හැක, එවිට විධානය වනුයේ:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

තනි කැපවීම

සමහර විචාරකයින් සඳහන් කර ඇති පරිදි, ඔබට නවතම කැපවීම වෙනස් කිරීමට අවශ්‍ය නම්, නැවත ගෙවීමේ විධානය අවශ්‍ය නොවේ. කරන්න

 git commit --amend --author "New Author Name <email@address.com>"

මෙය කතුවරයා නිශ්චිත නමට වෙනස් කරනු ඇත, නමුත් බැඳීම ඔබගේ වින්‍යාස කරන ලද පරිශීලකයාට git config user.nameසහ තුළ සැකසෙනු ඇත git config user.email. ඔබ සඳහන් කළ දෙයකට බැඳුම්කරය සැකසීමට ඔබට අවශ්‍ය නම්, මෙය කතුවරයා සහ බැඳීම යන දෙකම සැකසෙනු ඇත:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

ඒකාබද්ධ කිරීමේ කමිටු පිළිබඳ සටහන

මගේ මුල් ප්‍රතිචාරයේ සුළු අඩුපාඩුවක් තිබුණි. වත්මන් අතර යම් මුසුව අනාචාරයේ තිබේ නම් HEAD, ඔබේ <some HEAD before all your bad commits>, එසේ නම් git rebaseඔවුන් පැතලි ඇත (සහ මාර්ගය විසින්, ඔබ GitHub අදින්න ඉල්ලීම් භාවිතා කරන්නේ නම්, ඔබගේ ඉතිහාසයේ ඒකාබද්ධ අනාචාරයේ ටොන් වනු ඇත). මෙය බොහෝ විට වෙනස් ඉතිහාසයකට මඟ පෑදිය හැකිය (අනුපිටපත් වෙනස් කිරීම් "නැවත ප්‍රතිස්ථාපනය කළ හැකි බැවින්"), සහ නරකම අවස්ථාවෙහිදී, git rebaseදුෂ්කර ඒකාබද්ධ කිරීමේ ගැටුම් නිරාකරණය කිරීමට ඔබෙන් ඉල්ලා සිටීමට එය හේතු විය හැකිය (ඒකාබද්ධ කිරීමේ කමිටුවල දැනටමත් විසඳා ඇති). විසඳුම වන්නේ -pධජය භාවිතා කිරීමයි git rebase, එමඟින් ඔබේ ඉතිහාසයේ ඒකාබද්ධ ව්‍යුහය ආරක්ෂා වේ. git rebaseභාවිතා කිරීම -pසහ -iගැටළු වලට තුඩු දිය හැකි බවට මෑන්පේජ් අනතුරු අඟවයි , නමුත්BUGS එහි සඳහන් වන්නේ "කොමිස් සංස්කරණය කිරීම සහ ඔවුන්ගේ පණිවිඩ නැවත ලිවීම හොඳින් ක්‍රියාත්මක විය යුතු බවයි."

මම -pඉහත විධානයට එකතු කර ඇත්තෙමි . ඔබ නවතම කැපවීම වෙනස් කරන අවස්ථාව සඳහා, මෙය ගැටළුවක් නොවේ.


27
අමුතු කැපවීම සඳහා
විශිෂ්ටයි

32
සාමාන්‍ය එක් වැරැද්දක් නිවැරදි කිරීම සඳහා භාවිත කේතය සඳහන් කිරීම සඳහා +1: git commit --amend --author = පරිශීලක නාමය
නේතන් කිඩ්

12
මෙය පරිපූර්ණයි, මගේ වඩාත් පොදු භාවිත කේතය නම් මම වෙනත් පරිගණකයක වාඩි වී කතුවරයා සැකසීමට අමතක කර ඇති අතර සාමාන්‍යයෙන් <5 කොමිස් හෝ එසේ නිවැරදි කිරීමට ඇත.
සිට්‍රැක්ස්

57
git commit --amend --reset-authorඑක් වරක් ක්‍රියා කරන user.nameඅතර user.emailනිවැරදිව වින්‍යාස කර ඇත.
pts

14
පසුව සියලු අනාචාරයේ මත නැවත ලිවිය කතෘ තොරතුරු <commit>භාවිතා user.nameසහ user.emailසිට ~/.gitconfig: ලකුණු git rebase -i <commit> --exec 'git commit --amend --reset-author --no-edit', ඉතිරි, නතර කරන්න. සංස්කරණය කිරීමට අවශ්‍ය නැත!
ntc2

589

ඔබට ද කළ හැකිය:

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 "$@";
        else
                git commit-tree "$@";
        fi' HEAD

සටහන, ඔබ වින්ඩෝස් විධාන විමසුමේදී මෙම විධානය භාවිතා කරන්නේ නම්, ඒ "වෙනුවට ඔබ භාවිතා කළ යුත්තේ ':

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 "$@";
        else
                git commit-tree "$@";
        fi" HEAD

4
Env-filter භාවිතා කිරීම පහසු විසඳුමක් නොවේද? මෙයට වැඩි ඡන්ද ප්‍රමාණයක් ලැබෙන්නේ ඇයිදැයි විශ්වාස නැත.
stigkj

3
එවිට සබැඳිය කැඩී ඇත. අපි මෙම වෙනස්කම් වෙනත් ගබඩාවකට තල්ලු කරන්නේ කෙසේද?
රසල්

28
env-filter මඟින් සියලු කොමිස් වෙනස් වේ. මෙම විසඳුම කොන්දේසි සහිතව ඉඩ දෙයි.
user208769

5
"A previous backup already exists in refs/original/ Force overwriting the backup with -f"කණගාටුයි, නමුත් -f-flag මෙම ස්ක්‍රිප්ට් එක දෙවරක් ක්‍රියාත්මක කරන විට. ඇත්ත වශයෙන්ම එය බ්‍රයන්ගේ පිළිතුරෙහි ඇත, පෙරහන් ශාඛාව විසඳුම වූ විගසම බාධා කිරීම ගැන කණගාටුයි.
hhh

2
20 user208769 env-filter ද කොන්දේසි සහිතව ඉඩ දෙයි; මගේ පිළිතුර දෙස බලන්න :-)
stigkj

559

එක් ලයිනර් එකක්, නමුත් ඔබට බහු-පරිශීලක ගබඩාවක් තිබේ නම් ප්‍රවේශම් වන්න - මෙය එකම (නව) කතුවරයා සහ කැපවීම ඇති කර ගැනීම සඳහා වන සියලු කැපවීම් වෙනස් කරයි.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

නූලෙහි රේඛීය කඩනයන් සමඟ (එය බාෂ් වලින් කළ හැකි):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

සුළු කාරණය නම්, අපනයනය කිසිදු හානියක් සිදු නොවුනත් ඇත්ත වශයෙන්ම එය අතිරික්තය. උදා: git-filter-branch --env-filter "GIT_AUTHOR_NAME = 'නව නම'; GIT_AUTHOR_EMAIL = 'නව විද්‍යුත් තැපෑල'" HEAD.
ඇලෙක් ද ගීක්

4
ඔබ HEADවිධානය අවසානයේ සඳහන් කරන්නේ නම් එය සියලු කොමිස් නැවත ලියන්නේ ඇයි ?
නික් වොලින්කින්

1
මෙය මගේ බිට්බකට් නිධිය සඳහා ක්‍රියා නොකරයි, කිසියම් අදහසක් තිබේද? මම git push --force --tags origin 'refs/heads/*'උපදෙස් දුන්
විධානයෙන්

1
මේ සඳහා වන තල්ලු විධානය:$git push --force --tags origin 'refs/heads/master'
හර්ෂ් නිලේෂ් පතක්

1
පිළිවෙලට; මෙය පැරණි කාලරාමු ද තබා ගනී.
ධර්ම ටර්ට්ල්

221

ඔබට $ HOME / .gitconfig ආරම්භයක් නොමැති විට එය සිදු වේ. ඔබට මෙය නිවැරදි කළ හැකිය:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

git අනුවාදය 1.7.5.4 සමඟ පරීක්ෂා කර ඇත


9
එය අවසාන කැපවීම මත හොඳින් ක්‍රියාත්මක වේ. ලස්සන හා සරලයි. නැත ඇති යොදාගෙන, ගෝලීය වෙනස් විය යුතු --localද ක්රියා
බෙන්

මෙය මට විශාල ජයග්රාහකයා විය! මෙම git commit --amend --reset-author --no-editවිධානය මඟින් හරහා පසු-the-ඇත්ත නිවැරදි කතුවරයා තබා, ඔබ වැරදි, කතෘ තොරතුරු සමග අනාචාරයේ නිර්මාණය නම් මෙය විශේෂයෙන් වැදගත් වේ git config. මගේ විද්‍යුත් තැපෑල යාවත්කාලීන කිරීමට සිදු වූ මොහොතේම මගේ $$ ඉතිරි කර ඇත.
ecbrodie

187

තනි කැපවීමක් සඳහා:

git commit --amend --author="Author Name <email@address.com>"

(උපුටා ගත් පිළිතුරෙන් උපුටා ගන්නා ලදි)


14
නමුත් එය නවතම කැපවීම නම් පමණි
රිචඩ්

4
අනුව git help commit, git commit --amend“වත්මන් ශාඛාවේ කෙළවරේ” (එය හෙඩ්) බැඳීම වෙනස් කරයි. මෙය සාමාන්‍යයෙන් වඩාත්ම මෑත කාලීන කැපවීමයි, නමුත් එම බැඳීම සමඟ හෝ මුලින්ම පරීක්ෂා කිරීමෙන් ඔබට අවශ්‍ය ඕනෑම කැපවීමක් කළ හැකිය . git checkout <branch-name>git checkout <commit-SHA>
රෝරි ඕ'කේන්

12
නමුත් ඔබ එය කරන්නේ නම්, දෙමව්පියන් වශයෙන් දැනටමත් එම කැපවීම ඇති සියලු කැපවීම් යොමු වන්නේ වැරදි කැපවීමකට ය. එම අවස්ථාවේදී පෙරහන් ශාඛාව භාවිතා කිරීම වඩා හොඳය.
ජෝන් ගීට්සන්

3
O ජෝන් ජියෙට්සන්: ඔබට එය නිවැරදි කිරීම සඳහා වෙනස් කර ඇති දේ නැවත කළ හැකිය. කෙසේ වෙතත්, ඔබ කරන්නේ> 1 කැපවීම නම්, සඳහන් කළ පරිදි, පෙරහන් ශාඛාව බොහෝ පහසු වනු ඇත.
තනාටෝස්

5
මෙම වෙනස්කම් සිදු වන්නේ පමණක් authorනොවcommitter
නික් වොලින්කින්

179

ඉහළම කොමිෂන් සභා කිහිපය තුළ නරක කතුවරුන් සිටින අවස්ථාවක, පහත දැක්වෙන පරිදි විධානය සහ කැපවීම git rebase -iභාවිතා කරමින් ඔබට මේ සියල්ල කළ හැකිය .exec--amend

git rebase -i HEAD~6 # as required

එය ඔබට සංස්කරණය කළ හැකි කොමිස් ලැයිස්තුවක් ඉදිරිපත් කරයි:

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

exec ... --author="..."නරක කතුවරුන් සමඟ සියලු පේළි පසු පේළි එකතු කරන්න :

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

සංස්කාරකය සුරකින්න සහ පිටවන්න (ක්‍රියාත්මක කිරීමට).

මෙම විසඳුම අනෙක් ඒවාට වඩා ටයිප් කිරීමට දිගු විය හැකි නමුත් එය බෙහෙවින් පාලනය කළ හැකිය - එය පහර දෙන්නේ කුමක් දැයි මම හරියටම දනිමි.

දේවානුභාවයෙන් @asmeurer ට ස්තූතියි.


26
නිසැකවම නියමයි. Repo හි දේශීය වින්‍යාසය තුළ user.name සහ user.email සැකසීමෙන් ඔබට එය කෙටි කළ හැකිද, එවිට සෑම පේළියක්ම පමණක් exec git commit --amend --reset-author -C HEADතිබේද?
ඇන්ඩ rew

1
කැනොනිකල් පිළිතුර, පෙරහන් ශාඛාව භාවිතා කිරීම සඳහා, මා සඳහා මකාදැමූ refs / head / master. එබැවින් ඔබගේ පාලනය කළ හැකි, සංස්කරණය කළ හැකි විසඳුමට +1 කරන්න. ස්තූතියි!
jmtd

Someone else's commitඒ වෙනුවට ඔබ ආරම්භ කරන්නේ ඇයි my bad commit 1? මම HEAD^^අන්තිම කොමිෂන් 2 සංශෝධනය කිරීමට උත්සාහ කළ අතර එය හොඳින් ක්‍රියාත්මක විය.
fredoverflow

3
git rebase -i HEAD^^^^^^ඔබ වෙනුවට ලිවිය හැකියgit rebase -i HEAD~6
පැට්‍රික් ෂ්ලෙටර්

1
මෙය කොමිස් වල කාලරාමුව වෙනස් කරන බව කරුණාවෙන් සලකන්න. නිවැරදි කාලරාමු වෙත ආපසු හැරීම සඳහා stackoverflow.com/a/11179245/1353267 බලන්න
සැම්වීන්

111

ගිතුබ්ට හොඳ විසඳුමක් ඇත , එය පහත දැක්වෙන ෂෙල් පිටපත වේ:

#!/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" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
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"
'

5
පරිපූර්ණව වැඩ කළා. යන්තම් තිබුණා git reset --hard HEAD^පෙර අනුවාදය ඔවුන් ලබා ගැනීමට වෙනත් දේශීය නිධි මත වාර කිහිපයක්, git pullසංශෝධිත අනුවාදය -ed, මෙහි මම අඩංගු ඕනෑම රේඛා තොරව මම unknown <stupid-windows-user@.StupidWindowsDomain.local>(ආදරය GIT ගේ පැහැර හැරීම හා ඕනේ).
ඇලන් ප්ලම්

1
මට මෙයින් පසු තල්ලු කළ නොහැක. මට "-f" භාවිතා කළ යුතුද?
මාළු අධීක්ෂණය

9
මම කළා git push -f. එසේම, දේශීය ගබඩාවන් මෙයින් පසුව නැවත ලබා ගත යුතුය.
මාළු අධීක්ෂණය

ඔබට විශේෂිත ශාඛාවක් මත ෂෙල් ස්ක්‍රිප්ට් ධාවනය කිරීමට අවශ්‍ය නම් ඔබට අවසාන පේළිය වෙනස් කළ හැකිය: "මාස්ටර්..ඔබගේ ශාඛා-නම" (ඔබ ශාඛාවේ ශාඛා යැයි උපකල්පනය කර).
රොබට් කජික්

ස්ක්‍රිප්ට් යාවත්කාලීන කර ඇති බැවින් <හොඳ විසඳුම> සබැඳිය ක්ලික් කරන්න
gxpr

82

ඩොක්නොම් සඳහන් කළ පරිදි, ඉතිහාසය නැවත ලිවීම භයානක වන අතර අනෙක් අයගේ ගබඩාවන් බිඳ දමනු ඇත.

නමුත් ඔබට එය සැබවින්ම කිරීමට අවශ්‍ය නම් සහ ඔබ අවුල් සහගත පරිසරයක සිටී නම් (ලිනක්ස් හි කිසිදු ගැටළුවක් නොමැත, වින්ඩෝස් හි, ඔබට git bash භාවිතා කළ හැකිය, එය git ස්ථාපනය සමඟ සපයා ඇත), git filter-branch භාවිතා කරන්න :

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

දේවල් වේගවත් කිරීම සඳහා, ඔබට නැවත ලිවීමට අවශ්‍ය සංශෝධන පරාසයක් නියම කළ හැකිය:

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

2
මෙය පැරණි කොමිස් වෙත යොමු වන ඕනෑම ටැගයක් ඉතිරි කරන බව සලකන්න. --tag-name-filter catයනු "එය ක්‍රියාත්මක කරන්න" විකල්පයයි.
රෝමන් ස්ටාර්කොව්

ටැග් වෙනස් කරන්නේ කෙසේද යන්න පිළිබඳ කිසියම් අදහසක් @romkyns?
නික් වොලින්කින්

IckNickVolynkin ඔව්, ඔබ සඳහන් කරන්න --tag-name-filter cat. මෙය ඇත්ත වශයෙන්ම පෙරනිමි හැසිරීම විය යුතුය.
රෝමන් ස්ටාර්කොව්

48

වෙනත් කතුවරයකුගේ නොවරදින බැඳීමක් භාර ගන්නා විට, මෙය හැසිරවීමට පහසු ක්‍රමයක් තිබේ.

git commit --amend --reset-author


1
තනි කැපවීමක් සඳහා, සහ ඔබේ පරිශීලක නාමය තැබීමට ඔබට අවශ්‍ය නම්, මෙය වඩාත් පහසුම ක්‍රමයයි.
Pedro Benevides

7
--no-editමෙය වඩාත් පහසු කිරීම සඳහා ඔබට එකතු කළ හැකිය , සාමාන්‍යයෙන් බොහෝ දෙනෙකුට අවශ්‍ය වන්නේ ඊමේල් ලිපිනය පමණක් යාවත්කාලීන කිරීමට මිස
කැපවීමේ

ඔබට අවසන් වරට ඊමේල් / පරිශීලක නාමය නව එකක් සමඟ යාවත්කාලීන කිරීම සඳහා කරුණාකර git විධානය බෙදා ගන්න
adi

ඔබ මෙය උත්සාහ කළාද? මෙය අතුරු ආබාධයක් විය යුතුය, නැතිනම් stackoverflow.com/a/2717477/654245 හොඳ මාවතක් සේ පෙනේ.
රයන්ට්

47

ඔබට මෙය අන්වර්ථයක් ලෙස භාවිතා කළ හැකිය, එවිට ඔබට මෙය කළ හැකිය:

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

හෝ අවසාන කොමිෂන් 10 සඳහා:

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

~ / .Gitconfig වෙත එක් කරන්න:

[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\" $@; }; f "

මූලාශ්රය: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

එය ප්‍රයෝජනවත් යැයි සිතමි.


"git: 'change-commits' යනු git විධානයක් නොවේ. 'git --help' බලන්න."
Native_Mobile_Arch_Dev

මෙම විධානයෙන් පසු සහ මාස්ටර් සමඟ සමමුහුර්ත කිරීම ඉතිහාසයේ සියලු කැපවීම් අනුපිටපත් වේ! වෙනත් පරිශීලකයින් පවා :(
ව්ලැඩිමීර්

L ව්ලැඩිමීර් අපේක්ෂා කරන, කරුණාකර ඉතිහාසය වෙනස් කිරීම ගැන අධ්‍යයනය කරන්න
බ්‍රවුලියෝබෝ

මට නම් එය / bin / sh තුළ ක්‍රියාත්මක වන බව පෙනේ, එබැවින් මට bash- විශේෂිත පරීක්ෂණය [[ ]]sh-compatible test [ ](තනි වරහන්) සමඟ ප්‍රතිස්ථාපනය කිරීමට සිදුවිය . ඊට අමතරව එය ඉතා හොඳින් ක්‍රියාත්මක වේ, ස්තූතියි!
ස්ටෙෆන් ෂ්විගන්

39

මෙය @ බ්‍රයන්ගේ අනුවාදයේ වඩාත් සවිස්තරාත්මක අනුවාදයකි:

කතුවරයා සහ කැපවීම වෙනස් කිරීම සඳහා, ඔබට මෙය කළ හැකිය (නූල් වල රේඛා බිඳීම් සමඟ බාෂ් වලින් කළ හැකි):

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

ඔබට මෙම දෝෂ වලින් එකක් ලැබෙනු ඇත:

  1. තාවකාලික නාමාවලිය දැනටමත් පවතී
  2. Refs / original වලින් ආරම්භ වන refs දැනටමත් පවතී
    (මෙයින් අදහස් කරන්නේ මීට පෙර තවත් පෙරහන් ශාඛාවක් නිධිය මත ධාවනය කර ඇති අතර එවකට මුල් ශාඛා යොමු කිරීම refs / original හි උපස්ථ කර ඇති බවයි )

මෙම දෝෂ තිබියදීත් ධාවනය කිරීමට බල කිරීමට ඔබට අවශ්‍ය නම්, --forceධජය එක් කරන්න :

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විකල්පය පිළිබඳ කුඩා පැහැදිලි කිරීමක් අවශ්‍ය විය හැකිය: එමඟින් පෙරහන් ශාඛාව සියළුම සංශෝධනවල සියලු සංශෝධනයන් මත ක්‍රියා කරයි (සියළුම ශාඛා ද ඇතුළත් වන). මෙයින් අදහස් කරන්නේ, ටැග්ස් නැවත ලිවීම සහ නැවත ලියන ලද ශාඛා මත දැකිය හැකි බවයි.

පොදු "අත්වැරැද්දක්" යනු HEADඒ වෙනුවට භාවිතා කිරීමයි , එයින් අදහස් කරන්නේ සියලුම සංශෝධන වත්මන් ශාඛාව මත පෙරීමයි . නැවත ලියන ලද ශාඛාවේ කිසිදු ටැග් (හෝ වෙනත් යොමු) නොපවතී.


සියළුම යොමු / ශාඛා වල වෙනස්වීම් සිදුකරන ක්‍රියා පටිපාටියක් සැපයීම සඳහා වන ප්‍රශංසාව.
ජොනී t ටා

26

එක් විධානයක් පසුගිය එන් අනාචාරයේ සඳහා කතෘ වෙනස් කිරීමට:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

සටහන්

  • මෙම --no-editධජය බවට විශ්වාස git commit --amendඅමතර තහවුරු කියන්නේ නැහැ
  • ඔබ භාවිතා කරන විට git rebase -i, කර්තෘ වෙනස් කළ යුතු ස්ථාන ඔබට අතින් තෝරා ගත හැකිය,

ඔබ සංස්කරණය කරන ගොනුව මේ වගේ වනු ඇත:

pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

ඔබට කර්තෘ වෙනස් කිරීමට අවශ්‍ය තැන බැලීමට ඔබට සමහර පේළි වෙනස් කළ හැකිය. මෙය ඔබට ස්වයංක්‍රීයකරණය සහ පාලනය අතර හොඳ මැද තැනක් ලබා දෙයි: ක්‍රියාත්මක වන පියවර ඔබ දකින අතර ඔබ සියල්ල සුරකින විට සියල්ල එකවරම ක්‍රියාත්මක වේ.


නියමයි! ඔබට ස්තුතියි!
පැබ්ලෝ ලල්ලෝනි

මම HEAD ~ 8 භාවිතා කළ අතර එය අවසාන කොමිෂන් 8 ට වඩා වැඩි මාර්ගයක් පෙන්වයි.
බ්‍රයන් බ්‍රයිස්

1
Ry බ්‍රයන්බ්‍රයිස් ඒකාබද්ධ කිරීමේ කටයුතු තිබේ නම්, දේවල් සංකීර්ණ වේ :)
ක්‍රිස් මේස්

H ක්‍රිස්මේස් අහ්, මට පේනවා මොනවද වෙන්නේ කියලා. මට ඒවා සමඟ පටලවා ගැනීමට අවශ්‍ය නැත, මා සිටින ශාඛාව මත පමණි.
බ්‍රයන් බ්‍රයිස්

එවැනි අවස්ථාවකදී, ඔබ ස්වාමියාගෙන් අතු බෙදී යයි ඔබට සිතිය හැකිය:git rebase -i master -x ...
ක්‍රිස් මේස්

24
  1. දුවන්න git rebase -i <sha1 or ref of starting point>

  2. edit(හෝ e) සමඟ ඔබට වෙනස් කිරීමට අවශ්‍ය සියලු කැපවීම් සලකුණු කරන්න

  3. ඔබ සියලු කොමිස් සැකසෙන තුරු පහත විධානයන් දෙක ලූප කරන්න:

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

මෙය අනෙක් සියලුම බැඳීම් තොරතුරු (දිනයන් ඇතුළුව) තබා ගනී. මෙම --reuse-message=HEADවිකල්පය දියත් ඇති පණිවුඩය කර්තෘ වළක්වයි.


23

ටැග් සහ සියලුම ශාඛා ඇතුළුව සම්පූර්ණ ගබඩාවක් සඳහා කතුවරයා නැවත ලිවීමට මම පහත සඳහන් දෑ භාවිතා කරමි:

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

පෙරහන් ශාඛාවේ MAN පිටුවේ විස්තර කර ඇති පරිදි filter-branch, උපස්ථ කර ඇති සියලුම මුල් යොමු ඉවත් කරන්න (මෙය විනාශකාරී ය, පළමුව උපස්ථය):

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

2
එය භාවිතා කිරීම ඉතා වැදගත් වේ --tag-name-filter cat. එසේ නොමැතිනම් ඔබේ ටැග් මුල් කොමිස් දාමයේ රැඳෙනු ඇත. අනෙක් පිළිතුරු මෙය සඳහන් කිරීමට අසමත් වේ.
jeberle

21

මම මෙම විසඳුම අනුවර්තනය කරන ලද්දේ සරල author-conv-file( ආචරණය git-cvsimport සඳහා එකකි ). එය අර්ථ දක්වා ඇති පරිදි සියලු පරිශීලකයින් වෙනස් කිරීමෙන් ක්‍රියා කරයිauthor-conv-file සියලුම ශාඛා හරහා .

අපි මෙය භාවිතා කළේ සමගාමීවය cvs2gitඅපගේ ගබඩාව සීවීඑස් සිට ජිට් වෙත සංක්‍රමණය කිරීම සඳහා .

එනම් නියැදිය author-conv-file

john=John Doe <john.doe@hotmail.com>
jill=Jill Doe <jill.doe@hotmail.com>

පිටපත:

 #!/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

ස්තූතියි, මෙය මූලික git (හෝ git-svn) ක්‍රියාකාරී නොවන්නේ මන්දැයි මම කල්පනා කරමි. මෙය git svn clone සඳහා ධජයකින් කළ හැකිය, නමුත් git filter-branch වලින් නොවේ ...
ඩැනියෙල් හර්ෂ්කොවිච්

20

කතුවරයා / ඊමේල් ඔබගේ සුපුරුදු ක්‍රමයට වඩා වෙනස් නම් එකම ගැටළුව නම් මෙය ගැටළුවක් නොවන බව මම පෙන්වා දිය යුතුය. නිවැරදි විසඳුම නම් .mailmapඩිරෙක්ටරියේ පාමුලට ගොනුවක් වැනි රේඛා සහිතව නිර්මාණය කිරීමයි

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

එතැන් සිට, වැනි විධානයන් git shortlogඑම නම් දෙක එක හා සමාන යැයි සලකනු ඇත (ඔබ ඒවා නොකිරීමට නිශ්චිතවම නොකියන්නේ නම්). වැඩි විස්තර සඳහා http://schacon.github.com/git/git-shortlog.html බලන්න .

මෙහි ඇති අනෙකුත් සියලු විසඳුම්වල වාසිය මෙයයි, ඔබට ඉතිහාසය නැවත ලිවීමට අවශ්‍ය නොවන අතර, ඔබට උඩුගං බලා ඇත්නම් ගැටලු ඇති විය හැකි අතර සෑම විටම අහම්බෙන් දත්ත නැතිවීමට හොඳ ක්‍රමයකි.

ඇත්ත වශයෙන්ම, ඔබ ඔබ වැනි දෙයක් කර ඇති අතර එය සැබවින්ම වෙනත් අයෙකු විය යුතු අතර, මේ මොහොතේ ඉතිහාසය නැවත ලිවීමට ඔබට අවශ්‍ය නැත, කැපවූ කතුවරයා වෙනස් කිරීම බොහෝ විට ආරෝපණ අරමුණු සඳහා හොඳ අදහසක් විය හැකිය (එවැනි අවස්ථාවකදී මම ඔබව මගේ වෙත යොමු කරමි වෙනත් පිළිතුරක් මෙහි).


18

ඉදිරිපත් කරන ලද අනුවාදයන් ආක්‍රමණශීලී වීමට ක්‍රමයක් මම සොයා ගතිමි, විශේෂයෙන් ඔබ වෙනත් සංවර්ධකයින්ගෙන් පැච් කළහොත්, මෙය ඔවුන්ගේ කේතය සොරකම් කරනු ඇත.

පහත අනුවාදය සියලු ශාඛා වල ක්‍රියා කරන අතර එය වලක්වා ගැනීම සඳහා කතුවරයා සහ විකටයා වෙන වෙනම වෙනස් කරයි.

සියලු විකල්පයන් සඳහා කුඩෝස් leif81.

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<youmail@somehost.ext>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<youmail@somehost.ext>";
fi
' -- --all

18
  1. වෙනස් සිදු author name & emailවිසින් Amendඑවකට වෙනුවට, old-commit with new-one:

    $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <author@email.com>" # 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. තවත් ක්‍රමයක් 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 <author@email.com>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
    

2
හරිම ලස්සන පිළිතුරක්. මම කැමතියි යාවත්කාලීනයේ සිට ජිට් කොමිට් පිරිසිදු කිරීම දක්වා වෙනස් කර ඇත
ඇලෙක්ස්

12

මෙය කිරීමට වේගවත්ම, පහසුම ක්‍රමය වන්නේ git rebase හි --exec තර්කය භාවිතා කිරීමයි:

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

මෙය මේ ආකාරයට පෙනෙන ටෝඩෝ ලැයිස්තුවක් සාදනු ඇත:

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

මේ සියල්ල ස්වයංක්‍රීයව ක්‍රියාත්මක වන අතර එය ඔබට සිය ගණනක් කොමිස් ඇති විට ක්‍රියා කරයි.


9

ඔබ මෙම ගබඩාව එකම පරිශීලකයෙකු නම්, ඔබට කළ හැකි ඉතිහාසය ආපසු ෙහෝ භාවිතා git filter-branch(ලෙස svick ලියූ ), හෝ git fast-export/ git fast-import(දී නමෙන්ම ලිපියේ විස්තර කර ඇති පරිදි එකතු පෙරහන තිර රචනය docgnome පිළිතුර , හෝ අන්තර්) rebase . එහෙත් ඒ දෙකෙන් එකක් පළමු වෙනස් කළ බැඳීම් වලින් පසුව සංශෝධන වෙනස් කරනු ඇත; මෙයින් අදහස් කරන්නේ ඔබේ ශාඛාව පෙර නැවත ලිවීම මත ඔහුගේ / ඇයගේ වෙනස්කම් පදනම් කරගත් ඕනෑම කෙනෙකුට කරදරයක් බවයි.

අයකර ගැනීම

වෙනත් සංවර්ධකයින් ඔවුන්ගේ කාර්යයන් පූර්ව නැවත ලිවීමේ අනුවාදය මත පදනම් නොකළේ නම්, සරලම විසඳුම වනුයේ නැවත ක්ලෝන කිරීමයි (නැවත ක්ලෝන කිරීම).

විකල්පයක් ලෙස ඔවුන්ට උත්සාහ කළ හැකිය git rebase --pull, එය ඔවුන්ගේ ගබඩාවේ කිසිදු වෙනසක් සිදු නොවූයේ නම් වේගයෙන් ඉදිරියට යා හැකිය, නැතහොත් නැවත ලිවීමේ කොමිස් වලට ඉහළින් ඔවුන්ගේ ශාඛාව නැවත ප්‍රතිස්ථාපනය කළ හැකිය (ඒකාබද්ධ කිරීම වළක්වා ගැනීමට අපට අවශ්‍යය, එය පෙර නැවත ලිවීමේ කොමිට් සදහටම තබා ගන්නා බැවින්). මේ සියල්ලම උපකල්පනය කරන්නේ ඔවුන් සතුව වැඩ නොමැති බවයි; git stashවෙනත් ආකාරයකින් වෙනස්කම් වළක්වා ගැනීමට භාවිතා කරන්න.

වෙනත් සංවර්ධකයින් විශේෂාංග ශාඛා භාවිතා කරන්නේ නම් සහ / හෝ git pull --rebaseවැඩ නොකරන්නේ නම් උදා: උඩුමහල සකසා නොමැති නිසා, පශ්චාත් නැවත ලිවීමේ කොමිස් වලට ඉහළින් ඔවුන්ගේ වැඩ නැවත ප්‍රතිස්ථාපනය කළ යුතුය. උදාහරණයක් ලෙස නව වෙනස්කම් ( git fetch) ලබා ගැනීමෙන් පසුව , masterපදනම් කරගත් / අත්හැර දැමූ ශාඛාවක් සඳහා යමෙකු origin/masterධාවනය කළ යුතුය

$ git rebase --onto origin/master origin/master@{1} master

මෙන්න origin/master@{1}පෙර නැවත ලිවීමේ තත්වය (ලබා ගැනීමට පෙර), gitrevisions බලන්න .


විකල්ප විසඳුම වනුයේ 1.6.5 අනුවාදයේ සිට Git හි ඇති refs / replace / යාන්ත්‍රණය භාවිතා කිරීමයි . මෙම විසඳුමේදී ඔබ වැරදි විද්‍යුත් තැපෑලක් ඇති කොමිස් සඳහා ආදේශන සපයයි; පසුව ආශ්රේයන් 'වෙනුවට' කොටු ගවුමට කෙනෙකුට (වගේ දෙයක් fetch = +refs/replace/*:refs/replace/*සුදුසු ස්ථානයක refspec ඔවුන්ගේ .git/config ) විනිවිද පෙනෙන වෙනුවට ආදේශකයක් ලබා ගත හැකි බව, සහ එම ආශ්රේයන් ෙනොලැබී අය වයස අනාචාරයේ බලන්න.

ක්රියා පටිපාටිය මෙවැනි දෙයක් සිදු වේ:

  1. වැරදි ඊමේල් සමඟ සියලු කොමිස් සොයා ගන්න, උදාහරණයක් ලෙස භාවිතා කිරීම

    $ git log --author=user@wrong.email --all
    
  2. සෑම වැරදි ක්‍රියාවක් සඳහාම, ආදේශන බැඳීමක් නිර්මාණය කර එය වස්තු දත්ත ගබඩාවට එක් කරන්න

    $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt
    $ git hash-object -t commit -w tmp.txt
    <ID of corrected commit>
    
  3. දැන් ඔබ වස්තු දත්ත ගබඩාවේ ඇති බැඳීම නිවැරදි කර ඇති අතර, git replaceවිධානය භාවිතා කරමින් නිවැරදි කළ තැනැත්තා විසින් වැරදි සහ ස්වයංක්‍රීයව හා විනිවිදභාවයෙන් ආදේශ කිරීමට ඔබට git ට පැවසිය යුතුය :

    $ git replace <ID of wrong commit> <ID of corrected commit>
    
  4. අවසාන වශයෙන්, මෙම ක්‍රියා පටිපාටිය සාර්ථක වී ඇත්දැයි පරීක්ෂා කිරීම සඳහා සියලු ප්‍රතිස්ථාපන ලැයිස්තුගත කරන්න

    $ git replace -l
    

    ආදේශන සිදුවන්නේ දැයි පරීක්ෂා කරන්න

    $ git log --author=user@wrong.email --all
    

ඔබට ඇත්ත වශයෙන්ම මෙම ක්‍රියා පටිපාටිය ස්වයංක්‍රීය කළ හැකිය ... හොඳයි, සියල්ලම git replace(තවමත්) කණ්ඩායම් මාදිලියක් නොමැති ඒවා භාවිතා කිරීම හැර , එබැවින් ඔබට ඒ සඳහා ෂෙල් ලූප් භාවිතා කිරීමට හෝ "අතින්" ආදේශ කිරීමට සිදුවේ.

පරීක්ෂා කර නැත!වයි.එම්.එම්.වී.

refs/replace/යාන්ත්‍රණය භාවිතා කරන විට ඔබට රළු කොන් කිහිපයක් හමුවිය හැකි බව සලකන්න : එය අළුත් ය, තවමත් හොඳින් පරීක්‍ෂා කර නැත .


6

ඔබට නිවැරදි කිරීමට අවශ්‍ය කැපවීම් නවතම ඒවා නම්, ඒවායින් කිහිපයක් පමණක් නම්, ඔබට git resetසහgit stash දකුණු නම සහ ඊ-මාන කිරීමට පසු යළි ඔවුන් සිදු ආපහු යන්න.

අනුක්‍රමය මේ වගේ දෙයක් වනු ඇත (වැරදි 2 ක් සඳහා, අපේක්ෂිත වෙනස්කම් නොමැත):

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

5

ඔබ EGit සමඟ Eclipse භාවිතා කරන්නේ නම්, තරමක් පහසු විසඳුමක් තිබේ.
උපකල්පනය: අවලංගු පරිශීලකයෙකු නිසා දුරස්ථ ශාඛාවක් වන 'මාස්ටර්' වෙත තල්ලු කළ නොහැකි 'local_master_user_x' ප්‍රාදේශීය ශාඛාවක ඔබ සතුව ඇත.

  1. දුරස්ථ ශාඛාව 'මාස්ටර්' පරීක්ෂා කරන්න
  2. 'Local_master_user_x' හි වෙනස්කම් අඩංගු ව්‍යාපෘති / ෆෝල්ඩර / ගොනු තෝරන්න
  3. දකුණු-ක්ලික් කරන්න - ප්‍රතිස්ථාපනය කරන්න - ශාඛාව - 'local_master_user_x'
  4. මෙම වෙනස්කම් නැවත නිවැරදි පරිශීලකයා ලෙස සහ ප්‍රාදේශීය ශාඛාව 'මාස්ටර්' වෙත යොමු කරන්න
  5. දුරස්ථ 'මාස්ටර්' වෙත තල්ලු කරන්න

5

අන්තර්ක්‍රියාකාරී ප්‍රතිරෝධය භාවිතා කරමින්, ඔබට වෙනස් කිරීමට අවශ්‍ය එක් එක් කැපවීමෙන් පසුව ඔබට සංශෝධන විධානයක් තැබිය හැකිය. උදාහරණයක් වශයෙන්:

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

3
මෙහි ඇති ගැටළුව වන්නේ වෙනත් බැඳීම් පාර-දත්ත (උදා: දිනය සහ වේලාව) ද සංශෝධනය කිරීමයි. මම ඒක හොයාගත්තා අමාරුවෙන් ;-).
බාගෙට

5

Git විවිධ විද්‍යුත් තැපැල් ලිපින දෙකක් ගබඩා කරන බව සලකන්න , එකක් කැපවූ තැනැත්තාට (වෙනස් කළ පුද්ගලයා) සහ තවත් ලිපියක් කතුවරයාට (වෙනස ලියූ පුද්ගලයා).

බැඳීම් තොරතුරු බොහෝ ස්ථානවල දර්ශනය නොවේ, නමුත් ඔබට එය දැක ගත හැකිය git log -1 --format=%cn,%ce(නැතහොත් විශේෂිත බැඳීමක් නියම කිරීම showවෙනුවට භාවිතා කරන්න log).

ඔබගේ අවසාන කැපවීමේ කතුවරයා වෙනස් කිරීම තරම්ම සරල ය git commit --amend --author "Author Name <email@example.com>" , බැඳීම් තොරතුරු වලට සමාන දෙයක් කිරීමට එක් ලයිනර් හෝ තර්කයක් නොමැත.

විසඳුම නම් (තාවකාලිකව හෝ නොකිරීම) ඔබේ පරිශීලක තොරතුරු වෙනස් කිරීම, පසුව බැඳීම සංශෝධනය කිරීම, එමඟින් ඔබගේ වර්තමාන තොරතුරු වෙත බැඳීම යාවත්කාලීන කරනු ඇත:

git config user.email my_other_email@example.com 
git commit --amend

පැරණි අගය තවමත් ස්ථාන කිහිපයක පවතින බව සලකන්න path\to\repo\.git. එය මුළුමනින්ම ඉවත් කිරීම සඳහා ඔබ කළ යුත්තේ කුමක්දැයි මට තවමත් විශ්වාස නැත. අවාසනාවකට (?) සංශෝධනය මකා දැමූ බවක් නොපෙනේ.
රෆින්

5

කර්තෘ නාමයක UTF8 අක්ෂරයක් තැනීමේ සේවාදායකයට කරදරයක් වන ගැටලුවක් අප අද අත්විඳ ඇත, එබැවින් මෙය නිවැරදි කිරීම සඳහා ඉතිහාසය නැවත ලිවීමට අපට සිදු විය. ගත් පියවර:

පියවර 1: මෙහි ඇති උපදෙස් අනුව අනාගත පරිශීලක කටයුතු සඳහා ඔබගේ පරිශීලක නාමය git ලෙස වෙනස් කරන්න: https://help.github.com/articles/setting-your-username-in-git/

පියවර 2: පහත දැක්වෙන bash ස්ක්‍රිප්ට් ධාවනය කරන්න:

#!/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="me@something.com"
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

ඉක්මන් දළ විශ්ලේෂණය: ඔබගේ ගබඩාව තාවකාලික ගොනුවකට පරීක්ෂා කරන්න, සියලු දුරස්ථ ශාඛා පරීක්ෂා කරන්න, ඉතිහාසය නැවත ලිවීමට හැකි ස්ක්‍රිප්ට් ධාවනය කරන්න, නව රාජ්‍යය බලෙන් තල්ලු කරන්න, සහ වෙනස්කම් ලබා ගැනීම සඳහා ඔබේ සියලු සගයන්ට නැවත ඉල්ලීමක් කරන්නැයි කියන්න.

ඕඑස් එක්ස් හි මෙය ක්‍රියාත්මක කිරීමේදී අපට කරදරයක් වූයේ එය කෙසේ හෝ කැපවීමේ පණිවිඩවල පේළි අවසානය අවුල් කළ නිසා අපට එය ලිනක්ස් යන්ත්‍රයකින් නැවත ක්‍රියාත්මක කිරීමට සිදු වූ බැවිනි.


5

ඔබේ ගැටලුව ඇත්තෙන්ම පොදුයි. Git හි කතුවරුන්ගේ ලැයිස්තුව නිවැරදි කිරීමට තැපැල් සිතියම භාවිතා කිරීම බලන්න "

සරල බව සඳහා, ක්‍රියාවලිය පහසු කිරීම සඳහා මම පිටපතක් නිර්මාණය කර ඇත්තෙමි: git-changemail

එම ස්ක්‍රිප්ට් එක ඔබේ මාවතේ තැබීමෙන් පසු, ඔබට පහත දැක්වෙන විධානයන් නිකුත් කළ හැකිය:

  • වත්මන් ශාඛාවේ කර්තෘ ගැලපීම් වෙනස් කරන්න

    $ git changemail -a old@email.com -n newname -m new@email.com
    
  • <branch> සහ <branch2> හි කර්තෘ සහ බැඳීම් ගැලපීම් වෙනස් කරන්න. සමත් -fභාවිතා කලද, යලි ලිවීමෙන් ඉඩ පෙරහන-ශාඛාව

    $ git changemail -b old@email.com -n newname -m new@email.com -- -f &lt;branch> &lt;branch2>
    
  • පවතින පරිශීලකයින් repo හි පෙන්වන්න

    $ git changemail --show-both
    

මාර්ගය වන විට, ඔබගේ වෙනස්කම් සිදු කිරීමෙන් පසු, පෙරහන් ශාඛාවෙන් උපස්ථය පිරිසිදු කරන්න : git-backup-clean


1
මම ඔබේ විධානය ක්‍රියාත්මක කරන විට, එය පවසන්නේ "මාරාන්තික: 'git-changemail' ක්‍රියාත්මක කළ නොහැක: අවසරය ප්‍රතික්ෂේප කර ඇත"
ගෝවින්ද්


3

මගේ උදාහරණයද එක් කිරීමට මට අවශ්‍යය. දී ඇති පරාමිතිය සමඟ bash_function නිර්මාණය කිරීමට මට අවශ්‍යය .

මෙය මින්ට්-ලිනක්ස් -17.3 හි ක්‍රියා කරයි

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

function git_change_user_config_for_commit {

 # defaults
 WRONG_EMAIL=${1:-"you_wrong_mail@hello.world"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"new_mail@hello.world"}

 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;
}

2

ඔබ මෙම repo හි එකම පරිශීලකයා නම් හෝ වෙනත් පරිශීලකයින් සඳහා repo බිඳ දැමීම ගැන ඔබ තැකීමක් නොකරන්නේ නම්, ඔව්. ඔබ මෙම කොමිස් තල්ලු කර වෙනත් තැනකට පිවිසිය හැකි තැනක් තිබේ නම්, එසේ නොවේ, අනෙක් අයගේ ගබඩාවන් බිඳ දැමීම ගැන ඔබ තැකීමක් නොකරන්නේ නම් මිස. ගැටළුව වන්නේ මෙම කොමිස් වෙනස් කිරීමෙන් ඔබ නව SHAs උත්පාදනය කරනු ඇති අතර එමඟින් ඒවා විවිධ කොමිස් ලෙස සලකනු ඇත. වෙනස් වූ මෙම ක්‍රියාවන් සඳහා වෙනත් අයෙකු ඇද ගැනීමට උත්සාහ කරන විට, ඉතිහාසය වෙනස් වන අතර කබූම් වේ.

මෙම පිටුව http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html එය කරන්නේ කෙසේද යන්න විස්තර කරයි. (මම මෙය උත්සාහ කර නැත YMMV)


එබැවින්, user.email නැවත ලිවීමට ආරක්ෂිත ක්‍රමයක් නොමැත. අනෙක් සියල්ලන්ටම පහර නොදී. ඉතිහාසය නැවත ලිවීම නරක අදහසක් බව මම දැන සිටියෙමි, එය ආරක්ෂිතව කිරීමට පිරිසිදු ක්‍රමයක් තිබිය හැකි යැයි මම සිතුවෙමි. ස්තූතියි.
manumoomoo

@mediaslave: refs/replace/යාන්ත්‍රණය උත්සාහ කරන්න .
ජකුබ් නාරබ්ස්කි

meta.stackexchange.com/a/8259/184684 - aka, ඒවාට පිළිතුරු සැපයීමට සබැඳි එකතුව.
රෆින්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.