Видалити всі файли git з каталогу?


75

У мене є папка під контролем версій. Я хочу зробити його копію для розсилки, але не хочу включати всі каталоги .git та файли під ним.

Чи є спосіб видалити всі git-файли замість того, щоб видаляти їх усі вручну?


Ви можете написати невеликий сценарій для цього, але це стосується операційної системи.
Matten

Відповіді:


91

Папка .git зберігається лише в кореневому каталозі репозиторію, а не у всіх підкаталогах, таких як subversion. Ви зможете просто видалити одну папку, якщо ви не використовуєте підмодулі ... тоді у них теж буде одна.


8
Ах приголомшливо, думав, що це розподілено серед усіх піддиректорій, як svn!
user291701

8
Чому б ви його видалили ? Використання git archive; це для цієї мети, а то й просто перепрошувати все, крім каталогу .git.
Cascabel

1
Можливо, ви захочете також видалити свій .gitignoreфайл тощо. Я думаю, ви могли б написати сценарій для цього, але може бути простіше просто використовувати git-archive, а потім вручну видалити їх із заархівованої версії.
MatrixFrog

3
Тут ви можете знайти приклади того, як використовувати те, про git archiveщо згадує Єфромі. Також є посилання на запитання Stackoverflow 160608 .
Lernkurve

3
Ви занадто кмітливі. Цілком можливо мати каталог постачальників, у якому клоновані всілякі інші репозиторії. Git зберігає лише корінь, .gitале ви можете мати репозиторії скрізь, наприклад. vendor/something/something/.git.
srcspider

66

Як видалити всі .gitкаталоги з папки в Linux.

Запустіть цю команду find, вона перелічить усі .gitкаталоги в поточній папці:

find . -type d -name ".git" \
&& find . -name ".gitignore" \
&& find . -name ".gitmodules"

Друк:

./.git
./.gitmodules
./foobar/.git
./footbar2/.git
./footbar2/.gitignore

Має бути лише 3 або 4 .gitкаталоги, оскільки git має лише одну папку .git для кожного проекту. Ви можете rm -rf yourpathкожен з перерахованих вище вручну.

Якщо ви хочете видалити їх усі за одну команду і жити небезпечно:

//Retrieve all the files named ".git" and pump them into 'rm -rf'
//WARNING if you don't understand why/how this command works, DO NOT run it!

( find . -type d -name ".git" \
  && find . -name ".gitignore" \
  && find . -name ".gitmodules" ) | xargs rm -rf

//WARNING, if you accidentally pipe a `.` or `/` or other wildcard
//into xargs rm -rf, then the next question you will have is: "why is
//the bash ls command not found?  Requiring an OS reinstall.

@Jay Taylor, я ввожу зворотні скісні риски чи це частина команди?
Ерік Лещинський

Так - кінцеві скісні риски призначені для читабельності. У цій формі я вважаю, що це кваліфікується як "багаторядкова команда".
Джей Тейлор,

Подумайте про видалення .repoпапки (у верхній частині дерева) під час видалення всіх папок, пов’язаних з Git (якщо ви розробляєте Android). source.android.com/source/developing.html
CJBS

Я б видалив -type dпункт із .gitоператора find, тому файли підмодулів .git також видаляються.
pperejon

17

cd тоді до сховища

find . -name ".git*" -exec rm -R {} \;

Переконайтесь, що випадково не перенесете жодну крапку, косу риску, зірочку або інший підстановний знак регулярного виразу у пошук, інакше rmви з радістю видалите його.


1
Це чудово, але я отримую повідомлення після find: ./.git: No such file or directoryтого, як це працює. У будь-якому випадку, щоб зупинити показ повідомлення?
Рохан Дешпанде

16

Ви можете використовувати git-архів , наприклад:

git archive master | bzip2 > project.tar.bz2

Де masterзнаходиться потрібна гілка.


це займає 2 години проти миттєвогоcp -r
gcb

2
@gcb: cp -rне має справу з файлами та каталогами, які не є частиною сховища, що також включає ігноровані. Однак, якщо ви впевнені, що вам це не потрібно, і ваша обробка / час є критичною, звичайно, продовжуйте cp.
jweyrich

4
Чесно кажучи, git archiveмає недолік - він не експортує підмодулі. Потрібно було б git submodule foreach --recursive git archive .... Вкрай погано!
jweyrich

Відмова включати підмодулі - це особливість, а не недолік.
Вільям Перселл,

7

На випадок, якщо хтось інший натрапить на цю тему - ось рішення, яке більше підходить для всіх.

Якщо ви використовуєте .gitабо .svn, ви можете використовувати --exclude-vcsопцію tar. Це буде ігнорувати безліч різних файлів / папок, необхідних різним системам контролю версій.

Якщо ви хочете прочитати більше про це, перегляньте: http://www.gnu.org/software/tar/manual/html_section/exclude.html


1

На відміну від інших систем керування джерелами, таких як SVN або CVS, git зберігає всі свої метадані в одному каталозі, а не у кожному підкаталозі проекту. Тож просто видаліть .gitз кореня (або скористайтеся таким сценарієм, як git-export ), і у вас все буде добре.


1

ls | xargs find 2> / dev / null | egrep /\.git$ | xargs rm -rf

Ця команда (і це лише одна команда) буде рекурсивно видаляти каталоги .git (і файли), що знаходяться в каталозі, не видаляючи репозиторій git верхнього рівня, що зручно, якщо ви хочете зафіксувати всі ваші файли без керування будь-якими підмодулями .

знайти 2> / dev / null | egrep /\.git$ | xargs rm -rf

Ця команда зробить те саме, але також видалить папку .git з каталогу верхнього рівня.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.