Есть ли команда GIT, чтобы выполнить обратную операцию Git-Clean? Я хочу удалить папку .git и все отслеживаемые файлы, оставляя только без упущенных файлов и папок.

Предыстория: у меня есть тенденция создавать файлы заметок и другой контекст в своих репозиториях git. Например, я могу создать файл подсказок или файл ярлыка Windows, который упростит мне переход к папке со связанным содержимым. Когда я создаю новое репо из кончика ветки в другом репо, я хотел бы добавить его обратно в файлы контекста. Я ищу процедуру, которая позволила бы мне сделать копию исходной структуры репо, удалить все вещи, связанные с git, а затем скопировать то, что осталось, в новое чистое репо, которое я только что создал, эффективно передав все мои файлы, не относящиеся к git, из одно репо к другому.

git
0
edj 5 Ноя 2020 в 20:59

5 ответов

Лучший ответ

Моей заявленной целью было найти способ сохранить файлы, отличные от git, и я предполагал, что очистка файлов git - лучшее решение. Как предлагает @ mkreiger1, лучшим решением является не изменение исходного репо, а использование git для идентификации файлов, не являющихся репо, и их копирования. Приведенное ниже решение работает с пробелами в именах файлов и путях к папкам, сохраняя третье поле через EOL (удаление «удалит» в начале строки).

mkdir ../save_dir/
git clean -dfxn | awk '{$1=$2="" ; print $0}' | while read -r p
do 
  cp --parents "$p" ../save_dir/  
done
0
edj 9 Ноя 2020 в 22:14

Вы можете сделать неразрушающую копию, проанализировав вывод git clean. Это создаст save_dir в каталоге над вашей кассой. Это также сохранит структуру каталогов. Если вам не нужны каталоги, удалите опцию --parents.

mkdir ../save_dir
for x in `git clean -dfxn | awk '{print $3}'`; do
  cp --parents $x ../save_dir/
done
0
EncryptedWatermelon 5 Ноя 2020 в 18:16

Вы можете связать git ls-files с rm. тогда вам нужно будет удалить оставшиеся пустые каталоги - что-то вроде этого

git ls-files -z | xargs -0 rm
find . -type d -empty -print0 | xargs -0 rm -r
rm -rf .git

Обратите внимание, что я использую -z и -print0 в сочетании с xargs -0, чтобы сохранить любые имена файлов, содержащие пробелы (они используют нулевой байт ('\x00') в качестве разделителя)

Пробуя это в моем репозитории:

$ git clone -q git@github.com:asottile/astpretty
$ cd astpretty/
$ touch note
$ git ls-files -z | xargs -0 rm
$ find . -type d -empty -print0 | xargs -0 rm -r
$ rm -rf .git/
$ ls -al
total 16
drwxr-xr-x  2 asottile asottile  4096 Nov  5 10:03 .
drwxrwxrwt 19 root     root     12288 Nov  5 10:02 ..
-rw-r--r--  1 asottile asottile     0 Nov  5 10:02 note
0
Anthony Sottile 5 Ноя 2020 в 18:04

Чтобы ответить на вопрос, который вы задали напрямую:

git rm -r :/:*

Удалит все отслеживаемые файлы из рабочего дерева. (Возможно, вам придется добавить -f, если у вас есть незавершенная работа, но, вероятно, это не тот момент, когда это будет иметь смысл.) Вам все равно придется удалить папку .git, например,

rm -rf .git

Потому что git не имеет "противоположности" git init.

Основываясь на предоставленном вами предыстории, это может быть, а может и не быть лучшим способом делать то, что вы пытаетесь сделать - и похоже, что вы пересматриваете это - но я не могу понять, почему другие так сложные ответы на исходный вопрос, поэтому подумал, что это следует добавить к обсуждению.

-1
Mark Adelsberger 6 Ноя 2020 в 04:36

Я хочу удалить папку .git и все отслеживаемые файлы, оставив только неотслеживаемые файлы и папки.

git read-tree -um `git mktree <&-`   # track nothing, remove formerly-tracked
rm -rf .git                          # wipe
0
jthill 5 Ноя 2020 в 18:20