БовмСстная работаРСпозиторииБправочная докумСнтацияУдалСниС ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСпозитория

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСпозитория

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСпозитория β€” это двухэтапный процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя дСйствия ΠΊΠ°ΠΊ локально, Ρ‚Π°ΠΊ ΠΈ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ:

  1. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ очистка истории. На этом этапС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git-filter-repo для пСрСзаписи истории рСпозитория Π½Π° локальной машинС. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², Π·Π°ΠΌΠ΅Π½Ρƒ тСкста Π² содСрТимом Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ/ΠΈΠ»ΠΈ сообщСниях ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². ПослС этого локальная копия вашСй истории ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

  2. ОбновлСниС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ рСпозитория ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ очистка Π½Π° сСрвСрС. ПослС локальной очистки Π²Ρ‹ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отправляСтС (git push --force) ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Однако этого часто нСдостаточно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ старыС вСрсии Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ссылки Π½Π° Π½ΠΈΡ… Π² запросах Π½Π° слияниС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ критичСски Π²Π°ΠΆΠ½Ρ‹ΠΉ шаг β€” это ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π² слуТбу ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ GitVerse для ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ очистки кСшСй ΠΈ удалСния всСх ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ссылок Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° сторонС сСрвСра.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ очистка истории

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ срСдства для очистки истории локального рСпозитория

Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎΠ΅ ПО для очистки истории локального рСпозитория:

  1. git-filter-repo β€” соврСмСнный инструмСнт для пСрСзаписи истории Git, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

  2. git filter-branch β€” старый, ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ слоТный синтаксис.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ git-filter-repo ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС Π²Π΅Ρ‚ΠΊΠΈ ΠΈ Ρ‚Π΅Π³ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ:

  1. ВсС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ
  2. ВсС Ρ‚Π΅Π³ΠΈ
  3. Вся история ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², достиТимая ΠΈΠ· этих Π²Π΅Ρ‚ΠΎΠΊ

Π§Ρ‚ΠΎ НЕ обрабатываСтся автоматичСски:

  1. Π£Π΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ (remote branches) β€” ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  2. Π’Π΅Ρ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ локально (fetch).

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π’Π‘Π•Π₯ Π²Π΅Ρ‚ΠΎΠΊ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅:

# Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ всС ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ
git fetch --all
 
# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ всСх ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ
git branch -r | grep -v '\->' | while read remote; do
    git branch --track "${remote#origin/}" "$remote" 2>/dev/null || true
done
 
# Π—Π°Ρ‚Π΅ΠΌ запуститС git-filter-repo
git-filter-repo --replace-text sensitive_data_to_clean.txt

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ β€” ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ:

git-filter-repo --replace-text sensitive_data_to_clean.txt --refs refs/heads/ --refs refs/remotes/

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ очистки локального рСпозитория

  1. --invert-paths ΠΈ --invert-paths --path β€” ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· истории.
  2. --replace-text β€” Π·Π°ΠΌΠ΅Π½Π° тСкста Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ сообщСниях ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ².
  3. --message-callback β€” очистка тСкста Π² сообщСниях ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python-скрипта.
  4. --mailmap β€” Π·Π°ΠΌΠ΅Π½Π° email адрСсов ΠΈ ΠΈΠΌΠ΅Π½ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ².
  5. --commit-callback β€” Π³ΠΈΠ±ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python-скрипта.
  6. cat .git/filter-repo/changed-refs - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ
  7. grep -c '^refs/pull/.*/head$' .git/filter-repo/changed-refs β€” ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ количСства Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Ρ… запросов Π½Π° слияниС.

--invert-paths ΠΈ --invert-paths --path

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· истории:

git-filter-repo --invert-paths --path ПУВЬ-К-Π’ΠΠ¨Π•ΠœΠ£-ЀАЙЛУ-Π‘-ΠšΠžΠΠ€Π˜Π”Π•ΠΠ¦Π˜ΠΠ›Π¬ΠΠ«ΠœΠ˜-Π”ΠΠΠΠ«ΠœΠ˜

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ --path ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ» сущСствовал ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ путям ΠΈΠ·-Π·Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ. Π˜Π½Π°Ρ‡Π΅ для удалСния Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ запуск с Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ.

--replace-text

Π—Π°ΠΌΠ΅Π½Π° тСкста Π² Π½Π΅Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… истории с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π—Π°ΠΌΠ΅Π½Π° тСкста примСняСтся ΠΈ ΠΊ сообщСниям ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², Ссли Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ:

git-filter-repo --replace-text path/to/file/file_with_passwords.txt

Π€Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° --replace-text, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ строки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ search_string==>replacement_string. КаТдая строка Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ искомый тСкст, Π·Π°Ρ‚Π΅ΠΌ Π΄Π²Π° Π·Π½Π°ΠΊΠ° равСнства (==>), Π° Π·Π°Ρ‚Π΅ΠΌ тСкст для Π·Π°ΠΌΠ΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° со строками для Π·Π°ΠΌΠ΅Π½Ρ‹:

моя_старая_функция==>моя_новая_функция
ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ_пСрСмСнная==>Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ_пСрСмСнная
сСкрСтный_ΠΊΠ»ΡŽΡ‡_А==>скрытый_ΠΊΠ»ΡŽΡ‡_B

Если Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ тСкст для Π·Π°ΠΌΠ΅Π½Ρ‹, Ρ‚ΠΎ вмСсто Π·Π°ΠΌΠ΅Π½Ρ‹ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ тСкст Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° для удалСния:

моя_сСкрСтная_строка_123
API_KEY_Π’ΠžΠšΠ•Π
ΠΏΠ°Ρ€ΠΎΠ»ΡŒ_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

--message-callback

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° тСкста Π² сообщСниях ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΡƒΡŽ очистку ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Ρƒ тСкста нСпосрСдствСнно Π² сообщСниях ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Python-скрипт:

git-filter-repo --message-callback '
import re
 
secret_to_find = r"сСкрСт" # ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ для тСкста с ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
replacement_text = b"Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‡ΠΈΡ‰Π΅Π½ΠΎ ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…" # Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° мСстС Π·Π°ΠΌΠ΅Π½Ρ‹
 
if re.search(secret_to_find, message.decode("utf-8")):
    return replacement_text
return message
'

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ тСкст Π±Ρ‹Π» стСрт Π±Π΅Π· Π·Π°ΠΌΠ΅Π½Ρ‹, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ replacement_text слСдуСт ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ Π±Π°ΠΉΡ‚ΠΎΠ²ΡƒΡŽ строку replacement_text = b"".

--mailmap

Π—Π°ΠΌΠ΅Π½Π° email адрСсов ΠΈ ΠΈΠΌΠ΅Π½ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π°Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π²ΠΎ всСй истории рСпозитория:

git-filter-repo --mailmap <(echo "НовоС Имя <new-email@example.com> <old-email@personal.com>")
⚠️
  1. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ <(echo ...) Π² Windows β€” это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² bash, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .mailmap со списком Π·Π°ΠΌΠ΅Π½ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.
  2. Π’ mailmap-Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки для email. Π€ΠΎΡ€ΠΌΠ°Ρ‚ строки mailmap: НовоС Имя <Π½ΠΎΠ²Ρ‹ΠΉ-email@example.com> <старый-email@personal.com>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° mailmap.txt с нСсколькими Π·Π°ΠΌΠ΅Π½Π°ΠΌΠΈ (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки):

Личная ΠΏΠΎΡ‡Ρ‚Π° <public@example.com> <sensitive_personal@example1.com>
Рабочая ΠΏΠΎΡ‡Ρ‚Π° <new@company.com> <old@company.com>
Анонимный ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ <anon@example.com> <sensitive_personal@example2.com>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запуска ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ git-filter-repo --mailmap с Ρ„Π°ΠΉΠ»ΠΎΠΌ mailmap.txt (Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΏΠ°ΠΏΠΊΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Π²Ρ‹ΡˆΠ΅):

bash copy git-filter-repo --mailmap ../mailmap.txt

--commit-callback

Π“ΠΈΠ±ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python-скрипта. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ email адрСса, ΠΈΠΌΠ΅Π½Π°, Π΄Π°Ρ‚Ρ‹:

git-filter-repo --commit-callback '
# Π—Π°ΠΌΠ΅Π½Π° email Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚Π°
if commit.author_email == b"sensitive_personal@example.com":
    commit.author_email = b"public@email.com"
if commit.committer_email == b"sensitive_personal@example.com":
    commit.committer_email = b"public@email.com"
 
# Π—Π°ΠΌΠ΅Π½Π° ΠΈΠΌΠ΅Π½ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²
if commit.author_name == b"Π›ΠΈΡ‡Π½ΠΎΠ΅ Имя":
    commit.author_name = b"ΠŸΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ Имя"
'

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ --commit-callback ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ:

  1. Π”Π°Ρ‚Ρ‹ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ².
  2. БообщСния.
  3. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅. ВсС строковыС значСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (с прСфиксом b).
  1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ измСнСния Π΄Π°Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:

    git-filter-repo --commit-callback '
    import time
    from datetime import datetime
     
    # ИзмСняСм всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя
    current_timestamp = str(int(time.time())).encode("ascii")
    commit.author_date = current_timestamp + b" +0000"
    commit.committer_date = current_timestamp + b" +0000"
    '
  2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ измСнСния сообщСний ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:

    git-filter-repo --commit-callback '
    import re
     
    # УдаляСм Π½ΠΎΠΌΠ΅Ρ€Π° Π·Π°Π΄Π°Ρ‡ ΠΈΠ· сообщСний
    message_str = commit.message.decode("utf-8")
    # УдаляСм ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π²ΠΈΠ΄Π° "#1234" ΠΈΠ»ΠΈ "TASK-5678"
    clean_message = re.sub(r"#\d+|TASK-\d+", "", message_str).strip()
    commit.message = clean_message.encode("utf-8")
    '

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ

ПослС выполнСния git-filter-repo ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π²Π΅Ρ‚ΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² процСссС очистки:

cat .git/filter-repo/changed-refs

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ всС ссылки (refs), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ:

  1. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ (refs/heads/).
  2. Π£Π΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ (refs/remotes/).
  3. Π’Π΅Π³ΠΈ (refs/tags/).
  4. Запросы Π½Π° слияниС (refs/pull/).

Если Ρ„Π°ΠΉΠ» .git/filter-repo/changed-refs Π½Π΅ сущСствуСт, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ git-filter-repo Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π±Π΅Π· создания истории ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Для подсчСта количСства ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

# ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ всСх ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… ссылок
wc -l .git/filter-repo/changed-refs
 
# ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ
grep -c '^refs/heads/' .git/filter-repo/changed-refs
 
# ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ
grep -c '^refs/remotes/' .git/filter-repo/changed-refs

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Ρ… запросов Π½Π° слияниС

ПослС пСрСзаписи истории git-filter-repo Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ, сколько запросов Π½Π° слияниС ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ grep. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ GitVerse ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° старыС, содСрТащиС ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹.

grep -c '^refs/pull/.*/head$' .git/filter-repo/changed-refs

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ количСство строк, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ ^refs/pull/.*/head$, Π² Ρ„Π°ΠΉΠ»Π΅ .git/filter-repo/changed-refs. КаТдая такая строка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ связанный с Π½Π΅ΠΉ запрос Π½Π° слияниС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΡΡ‚Π°Ρ€ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π΄ΠΎ очистки.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ список Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Ρ… запросов Π½Π° слияниС вмСсто ΠΈΡ… количСства, ΡƒΠ±Π΅Ρ€ΠΈΡ‚Π΅ Ρ„Π»Π°Π³ -c:

grep '^refs/pull/.*/head$' .git/filter-repo/changed-refs
⚠️

Если ΠΏΡ€ΠΈ очисткС Π½Π΅ Π±Ρ‹Π» создан Ρ„Π°ΠΉΠ» .git/filter-repo/changed-refs, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Π΅Ρ€Π½Π΅Ρ‚ Π²Π΅Ρ€Π½Π΅Ρ‚ сообщСниС grep: .git/filter-repo/changed-refs: No such file or directory.

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния этих ΠΊΠΎΠΌΠ°Π½Π΄ ваш Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ синхронизирован с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ, ΠΈ всС измСнСния git-filter-repo Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Ρ‹.

ОбновлСниС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ рСпозитория ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ очистка Π½Π° сСрвСрС

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ очистили ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ рСпозитория локально, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пСрСнСсти эти измСнСния Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС слСды ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ Π½Π° сСрвСрС. Π­Ρ‚ΠΎΡ‚ процСсс Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ, ΠΏΡ€ΠΈ нСобходимости, взаимодСйствиС со слуТбой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ.

ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

Команда позволяСт ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ рСпозитория вашСй локальной, ΡƒΠΆΠ΅ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ вСрсиСй:

git push --force --mirror origin

Π³Π΄Π΅:

  • --force β€” Ρ„Π»Π°Π³ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ для пСрСзаписи истории ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСр.

  • --mirror β€” Ρ„Π»Π°Π³ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ отправятся всС ссылки (Π²Π΅Ρ‚ΠΊΠΈ, Ρ‚Π΅Π³ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ссылки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ refs/pull/) ΠΈΠ· вашСго локального рСпозитория Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ. Π­Ρ‚ΠΎ обСспСчиваСт Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ рСпозитория вашСй ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ локальной ΠΊΠΎΠΏΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ссылок Π½Π° старыС, содСрТащиС ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹;

  • origin β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, ΠΊΡƒΠ΄Π° Π²Ρ‹ отправляСтС измСнСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это основной ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

⚠️

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ согласуйтС дСйствия со всСми участниками рСпозитория. ВсС соавторы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ свои Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»ΠΎΠ½Ρ‹ рСпозитория ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ… Π·Π°Π½ΠΎΠ²ΠΎ, Π»ΠΈΠ±ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ТСсткий сброс (git reset --hard) ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои Π²Π΅Ρ‚ΠΊΠΈ с Π½ΠΎΠ²ΠΎΠΉ историСй.

Если Ρƒ вас Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π²Π΅Ρ‚ΠΎΠΊ, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° git push --force --mirror ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Π°. Π’ этом случаС Π²Π°ΠΌ придСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ Π²Π΅Ρ‚ΠΎΠΊ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ снова Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ очистки рСпозитория ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия

  1. УстановитС git-filter-repo, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:
sudo apt update
sudo apt install git-filter-repo
  1. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ всС измСнСния. Если Π΅ΡΡ‚ΡŒ Π½Π΅ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ (unstaged) ΠΈΠ»ΠΈ Π½Π΅Π·Π°ΠΊΠΎΠΌΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ (uncommitted) измСнСния, ΠΊΠΎΠΌΠ°Π½Π΄Π° git-filter-repo Π½Π΅ сработаСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

  2. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΡƒΡŽ копию вашСго рСпозитория. Π­Ρ‚ΠΎ критичСски Π²Π°ΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ git-filter-repo Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎ измСняСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ.

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ случайно Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΠ»ΠΈ API-ΠΊΠ»ΡŽΡ‡ MY_SECRET_API_KEY_123 Π² Ρ„Π°ΠΉΠ» config.js ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ упомянули Π΅Π³ΠΎ Π² сообщСнии ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» для Π·Π°ΠΌΠ΅Π½Ρ‹/удалСния тСкста, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, sensitive_data_to_clean.txt:

MY_SECRET_API_KEY_123==>***API_KEY_REMOVED***

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ просто ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Ρ‚ΠΎ:

MY_SECRET_API_KEY_123

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сообщСний ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² локально

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ git-filter-repo для удалСния API-ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ· содСрТимого Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сообщСний ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:

git-filter-repo --replace-text path/to/sensitive_data_to_clean.txt

Если Π±Ρ‹ API-ΠΊΠ»ΡŽΡ‡ Π±Ρ‹Π» Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ:

git-filter-repo --invert-paths --path path/to/your/config.js

Если Π±Ρ‹ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· сообщСний ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²:

git-filter-repo --message-callback '
import re
secret_key = r"MY_SECRET_API_KEY_123"
replacement = b"***KEY_REMOVED_FROM_FROM_MESSAGE***"
decoded_message = message.decode("utf-8")
new_message = re.sub(secret_key, replacement.decode("utf-8"), decoded_message)
return new_message.encode("utf-8")
'

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Ρ… запросов Π½Π° слияниС

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, сколько запросов Π½Π° слияниС ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° старыС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, содСрТащиС API-ΠΊΠ»ΡŽΡ‡:

grep -c '^refs/pull/.*/head$' .git/filter-repo/changed-refs

Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ большС нуля, Π²Π°ΠΌ потрСбуСтся ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ со слуТбой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ GitVerse.

ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

git push --force --mirror origin
⚠️

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΊΠΎΠ»Π»Π΅Π³ΠΈ освСдомлСны, ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚Ρƒ Π²Π΅Ρ‚ΠΎΠΊ, Ссли ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ.

Бвязь со слуТбой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ GitVerse (ΠΏΡ€ΠΈ нСобходимости)

Если запросы Π½Π° слияниС Π±Ρ‹Π»ΠΈ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ (шаг 4), ΡΠ²ΡΠΆΠΈΡ‚Π΅ΡΡŒ со слуТбой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ GitVerse ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ сСрвСрныС кэши ΠΈ ссылки.

Π’Ρ‹ нашли Ρ‡Ρ‚ΠΎ искали?