Jednym ze sposobów jest odwrotność - usuń wszystko oprócz pliku, który chcesz zachować.
Zasadniczo utwórz kopię repozytorium, a następnie użyj, git filter-branch
aby usunąć wszystko oprócz plików / folderów, które chcesz zachować.
Na przykład mam projekt, z którego chcę wyodrębnić plik tvnamer.py
do nowego repozytorium:
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
Wykorzystuje git filter-branch --tree-filter
to przejście przez każde zatwierdzenie, uruchomienie polecenia i ponowne zatwierdzenie wynikowej zawartości katalogów. Jest to niezwykle destrukcyjne (więc powinieneś to robić tylko na kopii swojego repozytorium!) I może zająć trochę czasu (około 1 minuty na repozytorium z 300 zatwierdzeniami i około 20 plikami)
Powyższe polecenie po prostu uruchamia następujący skrypt powłoki dla każdej wersji, którą musiałbyś oczywiście zmodyfikować (aby wykluczyć twój podkatalog zamiast tvnamer.py
):
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
Największym oczywistym problemem jest to, że pozostawia wszystkie komunikaty o zmianach, nawet jeśli nie są one związane z pozostałym plikiem. Skrypt git-remove-empty-commits rozwiązuje ten problem.
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
Musisz użyć -f
argumentu force run filter-branch
ponownie z czymkolwiek w refs/original/
(co w zasadzie jest kopią zapasową)
Oczywiście to nigdy nie będzie idealne, na przykład jeśli twoje komunikaty o zmianach wspominają o innych plikach, ale jest to tak blisko, jak pozwala na to prąd git (o ile wiem).
Ponownie, uruchamiaj to tylko na kopii swojego repozytorium! - ale podsumowując, aby usunąć wszystkie pliki oprócz „thisismyfilename.txt”:
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'