දේශීය ගොනු පද්ධතියෙන් ගොනුවක් මකා නොදමමින් Git ගබඩාවකින් ඉවත් කරන්න


3053

මගේ ආරම්භක කැපවීමේදී ලොග් ලිපිගොනු කිහිපයක් අඩංගු විය. මම *logමගේ වෙත එකතු කර ඇති .gitignoreඅතර දැන් මගේ ගබඩාවෙන් ලොග් ගොනු ඉවත් කිරීමට අවශ්‍යය.

git rm mylogfile.log

ගබඩාවෙන් ගොනුවක් ඉවත් කරනු ඇත, නමුත් එය දේශීය ගොනු පද්ධතියෙන් ඉවත් කරයි.

මම කොහොමද ප්රති සිට මෙම ගොනුව ඉවත් කළ හැක තොරව ගොනුවේ මගේ ප්රාදේශීය පිටපතක් මකා?



14
වඩාත්ම උද්දීපනය කළ පිළිතුර සමහරුන්ට භයානක බව සඳහන් කිරීම වටී. ඔබ ඔබට ඔබගේ දේශීය තල්ලු විට වඩා දුරස්ථ ණයකට භාවිතා කරන්නේ නම්, ඔබ GIT ඉවත් වෙනත් තැන්වල අදින්න එම ගොනු පමණක් මකා දමනු ඇත . මෙය එක් පිළිතුරක සඳහන් කර ඇති නමුත් අදහස් දක්වා නොමැත.
රිචීඑච්

Answers:


4366

සිට මිනිසා ගොනුව :

--cachedලබා දුන් විට , වේදිකාගත කර ඇති අන්තර්ගතය ශාඛාවේ අගයට හෝ තැටියේ ඇති ගොනුවට අනුරූප විය යුතු අතර එමඟින් ගොනුව දර්ශකයෙන් ඉවත් කිරීමට ඉඩ ලබා දේ.

එබැවින්, තනි ගොනුවක් සඳහා:

git rm --cached mylogfile.log

සහ තනි නාමාවලියක් සඳහා:

git rm --cached -r mydirectory

151
එය ස්වයං පැහැදිලි කිරීමක් නොවන නිසා පහසුවෙන් මඟ හැරේ svn rm --keep-local.
මාටින්

114
නමුත් දුරස්ථ සේවාදායකවල ගොනු සංරක්ෂණය කරන්නේ කෙසේද? මෙය මගේ දේශීය එකක් තබා ගනී, නමුත් මම වෙනත් සේවාදායකයකින් තල්ලු කර අදින්නේ නම්, ගොනුව මැකෙනු ඇත. මම ගොනුව සඳහා .gitignore ද එකතු කළෙමි, නමුත් එය තවමත් ඉවත් කර ඇත
spankmaster79

6
ඔබ තවමත් git pullgit rm
බැඳීම

9
වටිනා පිළිතුර විධානය ධාවනය පසු, ඔබ භාවිතා කිරීමට අවශ්ය බව පෙන්වා දෙමින් git commit -m "Commit message"හා git push. ඔබට වෙනත් වේදිකාගත වෙනස්කම් තිබේ නම් (පරීක්ෂා කර බලන්න git status), ඒවා ද මේ අවස්ථාවේ දී සිදු වේ.
සින්ජයි

9
මෙය වඩාත්ම පිළිගත් පිළිතුර වන අතර එය නොකරන නිසා, ඉල්ලන දේ, මම කරන දේ මම කියමි. මම විධානය භාවිතා කර git rm --cached mylogfile.logගබඩාවෙන් ගොනුව මකා දමමි. System ලදායී පද්ධතියේ ගොනුව නැතිවීම වළක්වා ගැනීම සඳහා මම ගොනුවේ උපස්ථයක් කර මෙයින් පසු අදින්නෙමි. කලින් සඳහන් කළ පරිදි ගොනුව මකා දැමිය හැකි අතර එය ඔබගේ උපස්ථයෙන් නැවත පිටපත් කළ යුතුය. මෙය බෙහෙවින් වේදනාවක්, නමුත් මෙම ගැටලුවට වඩා හොඳ විසඳුමක් මට හමු නොවීය.
මාසෙල් ග්‍රොල්ස්

275

Repo වෙතින් සම්පූර්ණ ෆෝල්ඩරයක් ඉවත් කිරීමට (Resharper ගොනු වැනි), මෙය කරන්න:

git rm -r --cached folderName

මම නැවත සකස් කිරීමේ ලිපිගොනු කිහිපයක් සිදු කර ඇති අතර ඒවා වෙනත් ව්‍යාපෘති භාවිතා කරන්නන් සඳහා දිගටම පවතිනු දැකීමට මා කැමති නොවීය.


13
අනාගත අමුත්තන් සඳහා අමතර සටහනක්: නැවත ගබඩාව වෙත ඇති බැඳීම "සමමුහුර්ත කිරීමට" GUI භාවිතා නොකරන්න. එමඟින් ලිපිගොනු ඔබගේ දේශීය ගබඩාවට ඇද දමනු ඇත. Git Push repo branchදුරස්ථයෙන් ලිපිගොනු සැබවින්ම ඉවත් කිරීමට ඔබ කළ යුතුය .
රබර් ඩක්

211

ඔබේ .gitignore මත පදනම් වූ ගබඩාවෙන් දේශීය ගොනු පද්ධතියෙන් මකා දැමීමෙන් තොරව ඒවා ඉවත් කළ හැකිය:

git rm --cached `git ls-files -i -X .gitignore`

නැතහොත්, විකල්පයක් ලෙස, වින්ඩෝස් පවර්ෂෙල් හි:

git rm --cached $(git ls-files -i -X .gitignore)

7
වින්ඩෝස් මත ක්‍රියා නොකරයි. git ls-files -i -X ​​.gitignore ක්‍රියා කරයි, නමුත් ලිපිගොනු 'git rm' වෙත යවන්නේ කෙසේදැයි මම නොදනිමි. එය කරන්නේ කෙසේදැයි ඔබ දන්නවාද?
එරික් ඉසෙඩ්

17
ඔබ cmd-console වෙනුවට Git Bash භාවිතා කරන්නේ නම් වින්ඩෝස් මත ක්‍රියා කරයි
ඇන්ඩ්‍රියාස් සීටා

17
මේකට ආදරෙයි. මා සතුව ලිපිගොනු කිහිපයක් ඇති බව හැරෙන්නට වැඩ කරන ලදී. මම මෙයට විසඳුම වෙනස් කළෙමි : git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". කරුණාකර මෙම විසඳුම වෙනස් කිරීම හෝ එකතු කිරීම ගැන සලකා බලන්න, මන්ද එය තිබීම හොඳ මෙවලමක් වන නිසා ...
mpettis

මම උත්සාහ කළේ නැත, නමුත් එය පරීක්ෂා කළ යුත්තේ එය .gitkeepගබඩාවේ හිස් ෆෝල්ඩරයක් සංරක්ෂණය කරන ගොනු ද ඉවත් කරයි. උදා. .gitignoreෆෝල්ඩරය අඩංගු වන uploadsඅතර repo නිරීක්ෂණය කිරීමට බල කෙරෙයි .gitkeep. සියල්ල යටින් ඇති repo වලින් ඉවත් කිරීමෙන් uploadsද එය ඉවත් වේ .gitkeep.
ව්ලැඩිමීර් වුකනාක්

මෙම යෝජනාව බලශක්තියෙන් පරිපූර්ණව ක්‍රියාත්මක විය: git rm --cached $ (git ls-files -i -X ​​.gitignore)
geekandglitter

89

මගේ පිළිතුරට අනුව: /programming/6313126/how-to-remove-a-directory-in-my-github-repository

ෆෝල්ඩරය / නාමාවලිය හෝ ගොනුව ඉවත් කිරීමට git නිධියෙන් පමණක් නොව දේශීයව නොව සරල පියවර 3 ක් උත්සාහ කරන්න.


නාමාවලිය ඉවත් කිරීමට පියවර

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

ඊළඟ කොමිස් වලදී එම ෆෝල්ඩරය නොසලකා හැරීමට පියවර

ඊළඟ කොමිස් වලින් එම ෆෝල්ඩරය නොසලකා හැරීම සඳහා .gitignore නමින් එක් ගොනුවක් root කර එම ෆෝල්ඩරවල නම එයට දමන්න. ඔබට අවශ්‍ය තරම් ප්‍රමාණයක් තැබිය හැකිය

.gitignore ගොනුව මේ වගේ වනු ඇත

/FolderName

නාමාවලිය ඉවත් කරන්න


එය උදව් කිරීම ගැන ගෞරව් සතුටුයි!
eirenaios

70

එසේම, ඔබ සංවේදී දත්ත (උදා: මුරපද අඩංගු ගොනුවක්) සිදු කර ඇත්නම්, ඔබ එය ගබඩාවේ ඉතිහාසයෙන් සම්පූර්ණයෙන්ම මකා දැමිය යුතුය. එය කරන්නේ කෙසේද යන්න පැහැදිලි කරන මාර්ගෝපදේශයක් මෙන්න: http://help.github.com/remove-sensitive-data/


13
මෙම පිළිතුර වෙනත් වෙබ් අඩවියකට සම්බන්ධ කිරීම වෙනුවට මෙම කාර්යය සම්පූර්ණ කිරීම සඳහා අවශ්‍ය විධානයන් ඇතුළත් විය යුතුය.
ෆ්ලෝරියන් ලෙමයිට්‍රේ

1
Git bfg repo cleaner මෙවලම භාවිතා කිරීම පහසු සහ වේගවත් බව මට පෙනී ගියේය .
Lubed Up Slug

64

වඩාත් ජනක විසඳුමක්:

  1. .gitignoreගොනුව සංස්කරණය කරන්න .

    ECHO mylogfile.log >> .gitignore

  2. සියලු අයිතම දර්ශකයෙන් ඉවත් කරන්න.

    git rm -r -f --cached .

  3. දර්ශකය නැවත ගොඩනඟන්න.

    git add .

  4. නව කැපවීමක් කරන්න

    git commit -m "Removed mylogfile.log"


2
මෙය ඇත්ත වශයෙන්ම ගොනුව මකා දමාවිද?
Mr_and_Mrs_D

6
GitHub වෙතින්? නොමැත. ඔබ දැනටමත් ගිතුබ් වෙත තල්ලු කර ඇත්නම් එය වෙබ් අඩවියෙන් ඉවත් නොකරනු ඇත. නමුත් එය ඔබගේ දේශීය git ගබඩාව යාවත්කාලීන කරනු ඇත.
mAsT3RpEE

5
ඔබ මකා දැමූ අදහස් ඇත්ත වශයෙන්ම ඉවත් කර ඇත :) විසඳුමේ ඇති ගැටළුව rm --cashedනම් එය අදින විට ගොනුව මකා දැමීමයි - හරිද? " දේශීය ගොනු පද්ධතියෙන් ගොනුවක් මකා නොදමමින් ගබඩාවෙන් ඉවත් කරන්න" යැයි පවසන විට මෙය මිනිසුන්ට අවශ්‍ය නොවේ . දැන් ඉහත විසඳුම මාගෙන් ඔබ්බට ගියේ ඇයි - බොහෝ විට OP තනිවම වැඩ කරන අතර කිසි විටෙකත් එය ඇද නොගත්තේ ඇයි? ඩන්නෝ. මට තේරෙනවා ගිතුබ් "වරක් සෑම විටම එතැනට තල්ලු කළා" ofc
Mr_and_Mrs_D නිකුතුව

ඔබ ගිතුබ්ගෙන්ම ඇසුවොත් මිස 100% විසඳුමක් ඇතැයි මම නොසිතමි. දැන් මේ සඳහා ඇලී සිටින්න. ගොනුව පිටපත් කරන්න, gitignore වෙත එක් කරන්න, සත්‍ය git rm -r කරන්න, කැපවීම, තල්ලු කිරීම, ගොනුව යථා තත්වයට පත් කිරීම. ඔබ වෙනත් විසඳුමක් සොයා ගැනීමට සමත් වූවාද?
mAsT3RpEE

9
මගේ ගැටළුව ගිතුබ් නොවේ - එය ඔවුන් ඇද ගන්නා විට ඇත්ත වශයෙන්ම ගොනුව සහායකයින්ගෙන් මකා දැමෙනු ඇත . ගොනුව මකා දැමීමට මට අවශ්‍ය නැත . මෙය අතීතයේ දී මට විශාල ගැටළු ඇති කර තිබේ. ඇත්තටම ඒ විසඳුමක් ඇත්තටම තිබේ නම් ඒ නිසා මම පුදුම වුණා නොවේ ගොනුව මකා දමන්න. පිළිගත් පිළිතුර ද බලන්න: stackoverflow.com/questions/1143796/…
Mr_and_Mrs_D

24

එම ගොනු නොවෙනස්ව පවතින බව උපකල්පනය කිරීමෙන් නොසලකා හැරීමට Git ඔබට ඉඩ දෙයි. මෙය සිදු කරන්නේ git update-index --assume-unchanged path/to/file.txtවිධානය ක්‍රියාත්මක කිරීමෙනි . ගොනුවක් එසේ සලකුණු කිරීමෙන් පසු, එම ගොනුවේ ඇති ඕනෑම වෙනස්කමක් git සම්පූර්ණයෙන්ම නොසලකා හරිනු ඇත; git තත්ත්වය හෝ git වෙනස ක්‍රියාත්මක කිරීමේදී ඒවා නොපෙන්වයි, ඔවුන් කිසි විටෙකත් කැප නොවනු ඇත.

( Https://help.github.com/articles/ignoring-files වෙතින් )

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

සටහන: මෙය ප්‍රශ්නයට කෙලින්ම පිළිතුරු සපයන්නේ නැත, නමුත් අනෙක් පිළිතුරු වල අදහස්වල පසු විපරම් ප්‍රශ්න මත පදනම් වේ.


2
හ්ම්, මම මෙය කළ නමුත් වෙනත් අයෙකු ගබඩාවේ වෙනස්කම් සිදු කරන්නේ නම් ගොනුව නැවත ලිවිය හැකි බව මට පෙනේ.
AlxVallejo

17

ඔබට ගොනුවක් ගලවා දේශීය හා දුරස්ථ repo වලින් මකා නොදැමීමට අවශ්‍ය නම් මෙම විධානය භාවිතා කරන්න:

git update-index --assume-unchanged  file_name_with_path

2
මෙය හොඳ පිළිතුරක් වන අතර, මිනිසුන් සාමාන්‍යයෙන් එම වචනය Git සමඟ භාවිතා කරයි යන අර්ථයෙන් මෙය ගොනුවක් "නොකැඩෙන" බව සටහන් කර ගැනීම වැදගත්ය, එහිදී හඳුනා නොගත් ගොනුවක් නිධිය ඉතිහාසයේ නැති අතර කිසි විටෙකත් නොතිබුණි . මෙම පිළිතුර මගින් ගොනුව නිධිය තුළ තබා ගැනීම නමුත් එහි වෙනස්කම් සිදු කර ඇති බව Git නොදැන සිටීම වළක්වයි. එයට සැලකිය යුතු වෙනස්කම් තිබේ - වඩාත්ම වැදගත් දෙය නම්, ගොනුව තවමත් අනෙක් අය සඳහා පවතින අතර, වෙනත් අයෙකු එහි වෙනස්කම් සිදු කර ඔබ අදින්නේ නම්, ඔබගේ දේශීය පිටපත තහවුරු කිරීමකින් තොරව නැවත ලිවිය හැකිය.
සෝරන් ජෝර්න්ස්ටැඩ්

8

ඉහත පිළිතුරු මට වැඩ කළේ නැත. මම පාවිච්චි කළාfilter-branch කැපවූ සියලුම ගොනු ඉවත් කිරීමට පුරුදුව .

Git ගබඩාවකින් ගොනුවක් ඉවත් කරන්න:

git filter-branch --tree-filter 'rm  file'

Git නිධියකින් ෆෝල්ඩරයක් ඉවත් කරන්න:

git filter-branch --tree-filter 'rm -rf directory'

මෙය සියලු කොමිස් වලින් නාමාවලිය හෝ ගොනුව ඉවත් කරයි.

මෙය භාවිතා කිරීමෙන් ඔබට බැඳීමක් නියම කළ හැකිය:

git filter-branch --tree-filter 'rm -rf directory' HEAD

හෝ පරාසයක්:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

සෑම දෙයක්ම දුරස්ථයට තල්ලු කිරීමට, ඔබට කළ හැක්කේ:

git push origin master --force

2
මෙය git rm -r --cached NAMEඔබගේ දේශීය git repo එකෙන් ඉවත් කර පසුව ඇද ගන්නා ඕනෑම කෙනෙකුට එය වළක්වා
ගැනීමේ උපක්‍රමයයි

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

0

ගොනු නොසලකා හරින්න, git වෙතින් ගොනු ඉවත් කරන්න, git යාවත්කාලීන කරන්න (ඉවත් කිරීම සඳහා).

සටහන: මෙය සංවේදී තොරතුරු සඳහා ඉතිහාසය සමඟ කටයුතු නොකරයි.

මෙම ක්‍රියාවලිය නිසැකවම git සමඟ සිදුවන්නේ කුමක්ද යන්න පිළිබඳව යම් අවබෝධයක් ලබා ගනී. කාලයාගේ ඇවෑමෙන්, එය ලබාගත් පසු, මම මෙවැනි ක්‍රියාදාමයන් කිරීමට ඉගෙන ගතිමි:

1) ගොනු නොසලකා හරින්න

  • .gitignoreඒවා නොසලකා හැරීම සඳහා ව්‍යාපෘතිය එක් කරන්න හෝ යාවත්කාලීන කරන්න - ඔබේ, මව් නාමාවලිය වැනි බොහෝ අවස්ථාවන්හිදී log/භාවිතා කිරීමට අවශ්‍ය රීජෙක්ස් වේ.
  • එම .gitignoreගොනු වෙනස් කිරීම සිදු කර තල්ලු කරන්න (තල්ලු කිරීම ඔබට අවශ්‍ය දැයි විශ්වාස නැත, සිදු වුවහොත් හානියක් නැත).

2) git වෙතින් ගොනු ඉවත් කරන්න (පමණක්).

  • දැන් git (පමණක්) සමඟ ගොනු ඉවත් කරන්න git remove --cached some_dir/
  • ඒවා තවමත් දේශීයව පවතින්නේ දැයි පරීක්ෂා කරන්න (ඒවා එසේ විය යුතුය!).

3) එම වෙනස එකතු කර කැප කරන්න (අත්‍යවශ්‍යයෙන්ම මෙය "එකතු කිරීම" විධානය නොතකා මකාදැමීමේ දේවල් "එකතු කිරීම" සඳහා වන වෙනසකි!)

  • git add .
  • git commit -m"removal"
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.