it-swarm-eu.dev

Odstraňování souboru z úložiště Git bez jeho odstranění z lokálního souborového systému

Moje počáteční potvrzení obsahovalo některé soubory protokolu. Přidal jsem *log do mého souboru .gitignore a nyní chci odstranit soubory protokolu z mého úložiště.

git rm mylogfile.log

odstraní soubor z úložiště, ale také jej odstraní z místního systému souborů.

Jak mohu odstranit tento soubor z repo bez smazání lokální kopie souboru?

2732
mveerman

Ze souboru man:

Když je dáno --cached, musí být postupný obsah shodný buď se špičkou větve, nebo se souborem na disku, což umožňuje odebrání souboru pouze z indexu.

Pro jeden soubor:

git rm --cached mylogfile.log

a pro jeden adresář:

git rm --cached -r mydirectory
3915
bdonlan

Chcete-li z repo odebrat celou složku (například soubory Resharper), postupujte takto:

git rm -r --cached folderName

Spáchal jsem nějaké soubory s resharperem a nechtěl jsem, aby ti, kteří budou pokračovat, zůstali pro jiné uživatele projektu.

260
Sam Tyson

Soubory můžete také odebrat z úložiště na základě vašeho .gitignore bez jejich odstranění z místního systému souborů:

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

Nebo alternativně ve Windows Powershell:

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

Podle mé odpovědi zde: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Chcete-li odstranit složku/adresář nebo soubor pouze z úložiště git a ne z místních, zkuste 3 jednoduché kroky.


Kroky k odstranění adresáře

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

Kroky k ignorování této složky v dalších provolbách

Chcete-li ignorovat tuto složku z následujících provizí, vytvořte jeden soubor v kořenovém adresáři s názvem .gitignore a vložte do něj název složek. Můžete dát tolik, kolik chcete

.gitignore soubor bude vypadat takto

/FolderName

remove directory

73
eirenaios

Pokud jste také zadali citlivá data (např. Soubor obsahující hesla), měli byste je zcela odstranit z historie úložiště. Zde je průvodce, který vysvětluje, jak postupovat: http://help.github.com/remove-sensitive-data/

67
BoD

Obecnější řešení:

  1. Upravit soubor .gitignore.

    ECHO mylogfile.log >> .gitignore

  2. Odstraňte všechny položky z indexu.

    git rm -r -f --cached .

  3. Znovu vytvořit index.

    git add .

  4. Udělejte nový závazek

    git commit -m "Removed mylogfile.log"

59
mAsT3RpEE

Git vám umožní tyto soubory ignorovat za předpokladu, že jsou nezměněny. To se provádí spuštěním příkazu git update-index --assume-unchanged path/to/file.txt. Jakmile označíte soubor jako takový, git zcela ignoruje všechny změny v tomto souboru; nebudou zobrazeny při spuštění git status nebo git diff, ani nebudou nikdy spáchány.

(Z https://help.github.com/articles/ignoring-files )

Neodstraňuje jej, ale ignoruje jeho změny navždy. Myslím si, že to funguje pouze lokálně, takže spolupracovníci mohou stále vidět změny, pokud nezačnou stejný příkaz jako výše. (Toto je však třeba ověřit.)

Poznámka: Toto není odpověď na otázku přímo, ale je založena na následných otázkách v komentářích ostatních odpovědí.

21
Rystraum

Pokud chcete soubor pouze rozbalit a neodstraňovat z lokálního a vzdáleného repo, pak použijte tento příkaz:

git update-index --assume-unchanged  file_name_with_path
8
Afraz Ahmad

Výše uvedené odpovědi pro mě nefungovaly. Použil jsem filter-branch k odstranění všech potvrzených souborů.

Odebrání souboru z úložiště git pomocí:

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

Odebrat složku z úložiště git pomocí:

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

To odstraní adresář nebo soubor ze všech povelů.

Zadání můžete zadat pomocí:

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

Nebo rozsah:

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

Chcete-li posunout vše do vzdáleného režimu, můžete provést:

git Push Origin master --force
5
Martijn Mellens