Подмодуль Github: как удалить или исключить подмодули? [Дубликат]

Вот несколько способов доступа к родительскому контексту внутри дочернего контекста -
  1. Вы можете использовать функцию bind().
  2. Хранить ссылку на контекст / внутри внутри другой переменной (см. пример ниже).
  3. Использовать функции ES6 Arrow .
  4. Изменить код / function design / architecture - для этого вы должны иметь команду над шаблонами проектирования в javascript.

1. Используйте функцию bind()

function MyConstructor(data, transport) {
    this.data = data;
    transport.on('data', ( function () {
        alert(this.data);
    }).bind(this) );
}
// Mock transport object
var transport = {
    on: function(event, callback) {
        setTimeout(callback, 1000);
    }
};
// called as
var obj = new MyConstructor('foo', transport);

Если вы используете underscore.js - http://underscorejs.org/#bind

transport.on('data', _.bind(function () {
    alert(this.data);
}, this));

2 Сохраните ссылку на контекст / внутри внутри другой переменной

function MyConstructor(data, transport) {
  var self = this;
  this.data = data;
  transport.on('data', function() {
    alert(self.data);
  });
}

3 Функция стрелки

function MyConstructor(data, transport) {
  this.data = data;
  transport.on('data', () => {
    alert(this.data);
  });
}
3075
задан Tim Castelijns 5 January 2016 в 16:02
поделиться

17 ответов

Поскольку git1.8.3 (22 апреля 2013 г.) :

Не было никакого фарфорового способа сказать: «Я больше не интересуюсь этим подмодулем», один раз вы выражаете свой интерес к подмодулю с помощью «submodule init». «submodule deinit» - это способ сделать это.

Процесс удаления также использует git rm (начиная с git1.8.5 октября 2013 г.).

Резюме

Процесс удаления из трех шагов будет следующим:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Объяснение

rm -rf: Это упоминается в Даниэль Шредер ответ и суммирован в Eonil в комментариями :

Это оставляет .git/modules/<path-to-submodule>/ неизменным. Поэтому, если вы однажды удалите подмодуль с этим методом и снова добавите их снова, это будет невозможно, потому что репозиторий уже поврежден.


git rm: См. commit 95c16418 :

В настоящее время с использованием «git rm» на подмодуле удаляется дерево работы подмодуля с деревом суперпроекта и gitlink из индекса. Но раздел подмодуля в .gitmodules остается нетронутым, что является остатком теперь удаленного подмодуля и может раздражать пользователей (в отличие от настройки в .git/config, это должно оставаться напоминанием о том, что пользователь проявил интерес к этому подмодулю поэтому он будет заселен позже, когда будет проверено более старое комманда).

Пусть «git rm» поможет пользователю не только удалить подмодуль из дерева работ, но и удалить «submodule.<submodule name> "из файла .gitmodules и обе стадии.


git submodule deinit: Это связано с этим патчем :

С помощью «git submodule init» пользователь может сказать git, что он интересуется одним или несколькими подмодулями, и хочет, чтобы он был заполнен при следующем вызове на «git submodule update». Но в настоящее время нет простого способа, чтобы они могли сказать git, что они больше не интересуются подмодулем, и хотят избавиться от локального дерева работ (если пользователь не знает много о внутренних функциях подмодуля и удаляет настройку «submodule.$name.url» из .git/config вместе с самим деревом работы.

Помогите этим пользователям предоставить команду «deinit». Это удаляет весь раздел submodule.<name> из .git/config либо для данного подмодуля (ов) (или для всех тех, которые были инициализированы, если задано «.»). Сбой, если текущее дерево работы содержит модификации, если не принудительно. Жалуйтесь, если для подмодуля, указанного в командной строке, настройка URL не найдена в .git/config, но, тем не менее, не прерывается.

Это позаботится, если шаги инициализации (de) (.git/config и .git/modules/xxx)

Поскольку git1.8.5, git rm принимает также уход за:

  • 'add' шагом, который записывает url подмодуля в файле .gitmodules: его нужно удалить для вас.
  • специальная запись подмодуля (как иллюстрируется этот вопрос ): git rm удаляет его из индекса: git rm --cached path_to_submodule (без конечной косой черты) Это удалит этот каталог хранится в индексе со специальным режимом «160000», отмечая его как корневой каталог подмодуля.

Если вы забудете этот последний шаг и попытаетесь добавить то, что было подмодулем, как регулярный каталог, вы получите сообщение об ошибке вроде:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Примечание: поскольку Git 2.17 (Q2 2018), git submodule deinit больше не является скриптом оболочки. Это вызов функции C.

См. commit 2e61273 , commit 1342476 (14 января 2018 г.) в Пратамеш Чаван (pratham-pc) . (Слияние с Junio ​​C Hamano - gitster - в совершить ead8dbe , 13 февраля 2018 г.)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"
1804
ответ дан VonC 22 August 2018 в 03:51
поделиться
  • 1
    Можете ли вы привести пример использования для submodule deinit? – zakdances 28 April 2013 в 19:42
  • 2
    @yourfriendzak вот пример того, кто успешно его использует: stackoverflow.com/a/16161950/6309 . Но имейте в виду, что, вопреки тому, что я изначально считал, 1.8.3 еще не выпущен! В Unix вы можете скомпилировать его из источников. – VonC 28 April 2013 в 19:45
  • 3
    @HamishDowner, специальная запись должна исчезнуть (каталог больше не является подмодулем), а .gitmodules должен быть в порядке, но я бы все же дважды проверил что-либо с каталогом .git (т.е. local config, в вашем локальном репо: это не изменяется с помощью git pull) – VonC 4 June 2013 в 16:40
  • 4
    @Jayen да, если вы зафиксируете удаление записи .gitmodules и удаление специальной записи в индексе и нажмите это репо, другие могут потянуть ее, и этот подмодуль исчезнет. – VonC 2 August 2013 в 07:04
  • 5
    Вот сценарий, который автоматизирует эти шаги: gist.github.com/sharplet/6289697 . Добавьте его в свои PATH и git remove-submodule path/to/submodule. – Adam Sharp 21 August 2013 в 03:26

На странице Учебник по субмодулю Git :

Чтобы удалить подмодуль, вам необходимо:

  1. Удалить соответствующий раздел из файла .gitmodules.
  2. Выполните изменения .gitmodules git add .gitmodules
  3. Удалите соответствующий раздел из .git/config.
  4. Запустите git rm --cached path_to_submodule (нет конечной косой черты).
  5. Выполнить rm -rf .git/modules/path_to_submodule
  6. Commit git commit -m "Removed submodule <name>"
  7. Удалить теперь невосстановленные файлы подмодуля rm -rf path_to_submodule

См. также: альтернативные шаги ниже .

3148
ответ дан 17 revs, 12 users 53% 22 August 2018 в 03:51
поделиться
  • 1
    «И, кстати, есть ли причина, по которой я не могу просто git subodule rm?» ? – abernier 20 January 2011 в 20:04
  • 2
    @abernier Короткий ответ может быть «потому что такой команды нет». Я предполагаю, что они пытаются сделать удаление файлов подмодулей против конфигурации подмодулей явным, чтобы избежать случайной потери данных. Возможно, один человек подумает, что git submodule rm просто удаляет регистрацию подмодулей и будет удивлен, если команда также удалит локальный репозиторий. Любые локальные изменения будут безвозвратно потеряны. И, возможно, другой человек подумает, что только файлы будут удалены. – John Douthat 21 January 2011 в 02:50
  • 3
    Честно говоря, я не знаю, почему. Надеюсь, они добавят команду. Эти 4 шага слишком сложны. – John Douthat 21 January 2011 в 02:56
  • 4
    Вот сценарий bash, который удаляет подмодуль, просто создайте псевдоним git для subodule-rm;) gist.github.com/2491147 – Capi Etheriel 25 April 2012 в 18:27
  • 5
    также нужно rm -rf .git \ modules \ имя подмодуля? – rogerdpack 22 May 2012 в 18:31

Простые шаги

  1. Удалить записи конфигурации: git config -f .git/config --remove-section submodule.$submodulename git config -f .gitmodules --remove-section submodule.$submodulename
  2. Удалить каталог из индекса: git rm --cached $submodulepath
  3. Commit
  4. Удалить неиспользуемые файлы: rm -rf $submodulepath rm -rf .git/modules/$submodulename

Обратите внимание: $submodulepath не содержит ведущие или завершающие косые черты.

Фон

Когда вы выполняете git submodule add, он добавляет его только к .gitmodules, но как только вы сделали git submodule init, он добавил к .git/config.

Поэтому, если вы хотите удалить модули, но сможете быстро их восстановить, выполните следующие действия:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

Рекомендуется сначала сделать git rebase HEAD, а git commit - на end, если вы поместите это в скрипт.

Также посмотрите на ответ на вопрос: могу ли я разогнать подмодуль Git? .

185
ответ дан 5 revs, 4 users 69% 22 August 2018 в 03:51
поделиться
  • 1
    У меня было много подмодулей (и большой беспорядок), поэтому я должен был пройти их через цикл. Поскольку большинство из них, где под конкретным каталогом и выходом ls, содержались конечные косые черты. Я сделал что-то вроде for dir in directory/*; do git rm --cached $dir; done. – Pablo Olmos de Aguilera C. 9 October 2011 в 21:50
  • 2
    Чтобы получить этот список, который можно использовать в скрипте для рекурсивного удаления - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' - - похоже, что вам действительно нужно это сделать в случае, если что-то испортилось, иначе просто git submodule | grep -v '^+' | cut -d' ' -f3 – errordeveloper 12 October 2011 в 01:43
  • 3
    получить список модулей, в которых локальные изменения не были сделаны - git submodule | grep '^+' | cut -d' ' -f2 – errordeveloper 12 October 2011 в 02:01
  • 4
    Заметьте, мне пришлось включить submodulename в двойные кавычки "submodulename" .. ссылаясь на файл .git/config – muon 20 July 2017 в 15:22
  • 5
    # 2 был именно тем, что я искал, спасибо! +1 – AyexeM 26 September 2017 в 15:06

Если вы только что добавили подмодуль, и, например, вы просто добавили неправильный субмодуль или добавили его в неправильное место, просто сделайте git stash, затем удалите папку. Это предполагает, что добавление подмодуля - единственное, что вы сделали в недавнем репо.

4
ответ дан botbot 22 August 2018 в 03:51
поделиться

Вы должны удалить запись в .gitmodules и .git/config и удалить каталог из истории из истории:

git rm --cached path/to/submodule

Если вы напишете список рассылки git, возможно, кто-то будет сделайте для вас сценарий оболочки.

46
ответ дан Carmine Paolino 22 August 2018 в 03:51
поделиться

Вы можете использовать псевдоним для автоматизации решений, предоставляемых другими:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Поместите это в свою конфигурацию git, а затем вы можете сделать: git rms path/to/submodule

40
ответ дан Charles 22 August 2018 в 03:51
поделиться

Я нашел, что deinit работает хорошо для меня:

git submodule deinit <submodule-name>    
git rm <submodule-name>

Из git docs :

deinit

Отменить регистрацию данных подмодулей, т. е. удалить весь раздел submodule.$name из .git / config вместе с их деревом работы.

15
ответ дан Damjan Pavlica 22 August 2018 в 03:51
поделиться

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

git submodule add blah@blah.com:repos/blah.git lib/blah

Run:

git rm lib/blah

Вот и все.

Для старых версий git (около 1.8.5) используйте:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
45
ответ дан Doug 22 August 2018 в 03:51
поделиться
  • 1
    +1 действительно. Это единственный правильный ответ от git 1.8.3 и выше. Должен приниматься как правильный. – Xananax 2 July 2014 в 19:26
  • 2
    +1 Правильный и чистый способ удаления в новых версиях git. – Xiv 22 August 2014 в 10:04
  • 3
    git rm все еще оставляет материал в .git/modules/. (2.5.4) – Rudolf Adamkovič 2 January 2016 в 15:40
  • 4
    @RudolfAdamkovic это работает для меня? Обратите внимание, что только удаляет запись подмодуля, если соответствует точный путь; если вы переместили подмодуль, а затем используете git rm, это не так; Быстрый тест с 2.5.4 на моем mac обновляет файл .gitmodules, как описано в документации: git-scm.com/docs/git-rm#_submodules ... но если у вас есть нашел какую-то комбинацию платформы / версии, где этого не происходит, вам, вероятно, следует добавить ошибку. – Doug 2 January 2016 в 16:48
  • 5
    Этот ответ не совсем корректен. git rm оставляет материал в файле .git/modules/ dir и .git/config (ubuntu, git 2.7.4). Другие ответы работают 100%: stackoverflow.com/a/36593218/4973698 – mbdevpl 7 September 2016 в 06:03

Большинство ответов на этот вопрос устарели, неполны или излишне сложны.

Подмодуль, клонированный с использованием git 1.7.8 или новее, оставит не более четырех своих следов в вашем локальном репо. Процесс удаления этих четырех трасс задается тремя командами ниже:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
249
ответ дан fvgs 22 August 2018 в 03:51
поделиться
  • 1
    Почему у этого ответа так мало оборотов? Все эти популярные ответы что-то пропускают, это единственный, который действительно удаляет все следы подмодуля самым простым способом. И обратите внимание: порядок команд имеет значение. – mbdevpl 7 September 2016 в 06:08
  • 2
    Чтобы ответить на мой собственный вопрос: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows – Thomas 19 January 2017 в 23:19
  • 3
    @mbdevpl пришел через 3 года после принятого ответа, и я думаю, никто не смог убедить OP принять этот – Andy 20 February 2017 в 02:58
  • 4
    @Thomas rm -rf просто означает "удалить всю папку" поэтому вы можете сделать это из графического интерфейса Explorer в Windows. Кроме того, если вы используете git в Windows, у вас также будет доступ к git bash, поэтому вы можете запускать все эти команды там, и они будут работать так, как они есть – Andy Madge 8 December 2017 в 12:24
  • 5
    ЭТО - непростой ответ в 2018 году? – Warren P 2 February 2018 в 23:43

Я только что нашел скрытый файл .submodule (забыли точное имя), у него есть список ... вы можете стереть их индивидуально таким образом. У меня только один, поэтому я удалил его. Просто, но это может испортить Гит, так как я не знаю, прикреплено ли что-то к подмодулю. Кажется, все хорошо, кроме обычной проблемы обновления libetpan, но это (надеюсь) не связано.

Заметили, что никто не опубликовал ручное стирание, поэтому добавил

80
ответ дан GAMITG 22 August 2018 в 03:51
поделиться
  • 1
    У меня были проблемы с этим. Если вы попытаетесь переустановить подмодуль к одному и тому же пути, он сохранит информацию о филиале в кэше в указанном вами месте, которое испортит вещи. – jangosteve 6 March 2012 в 00:27
  • 2
    Спасибо, мне тоже это нужно. @ Антон, я согласен, и я отредактировал ответ topvoted, чтобы добавить эту информацию. – William Denniss 23 September 2012 в 16:17
  • 3
    Я использовал параметр -name, чтобы выполнить замену ... см. stackoverflow.com/questions/14404704/… – joseph.hainline 18 January 2013 в 20:06
  • 4
    поэтому все остальные, кто сбрасывает мои изменения, должны будут запустить rm -rf $ path_to_submodule rm -rf .git / modules / $ path_to_submodule, чтобы удалить кеш субмодуля? – j2emanue 24 April 2015 в 15:09
  • 5
    Я рекомендую обновить git submodule update. И если пути подмодулей не были обновлены правильно (git выдает ошибку), удалите их: rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update – luissquall 29 April 2015 в 00:22
  • 6
    Спасибо за это. Для меня мне пришлось изменить порядок первых трех шагов на 3), 1), 2). Выполнение 1) сначала дало fatal: no submodule mapping found in .gitmodules for path 'submodule_name' на шаге 3. Однако оба шага были необходимы. (git v2.8.2) – U007D 25 August 2016 в 00:16
  • 7
    точно мой случай – zhekaus 21 May 2017 в 09:28

То, что я сейчас делаю Dec 2012 (объединяет большинство этих ответов):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
16
ответ дан Lance Rushing 22 August 2018 в 03:51
поделиться

Вот 4 шага, которые я нашел необходимыми или полезными (важными в первую очередь):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

Теоретически git rm в шаг 1 должен позаботиться о Это. Надеюсь, на вторую часть вопроса ОП можно ответить положительно в один прекрасный день (это можно сделать по одной команде).

Но с июля 2017 года шаг 2 необходим для удаления данных в .git/modules/, в противном случае вы не можете, например. добавьте подмодуль в будущем.

Возможно, вам удастся избежать вышеупомянутых двух шагов для git 1.8.5+, поскольку ответ tinlyx отмечен, поскольку все команды git submodule, похоже, работают.

Шаг 3 удаляет секцию для the_submodule в файле .git/config. Это необходимо сделать для полноты. (Запись может вызвать проблемы для старых версий git, но у меня нет возможности ее протестировать).

Для этого в большинстве ответов рекомендуется использовать git submodule deinit. Я нахожу его более явным и менее запутанным для использования git config -f .git/config --remove-section. Согласно документации git-subodule , git deinit:

Отменить регистрацию данных подмодулей ... Если вы действительно хотите удалить подмодуль из репозитория и зафиксировать его Вместо этого используйте git-rm [1].

И последнее, но не менее важное: если вы не git commit, вы будете / могут получить ошибку при выполнении git submodule summary (по состоянию на git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

Это независимо от того, выполняете ли вы шаги 2 или 3.

5
ответ дан laser 22 August 2018 в 03:51
поделиться

Я должен был выполнить шаги Джона Дютута еще на один шаг и cd в каталог подмодуля, а затем удалить репозиторий Git:

cd submodule
rm -fr .git

Тогда я мог бы зафиксировать файлы как часть родительский репозиторий Git без старой ссылки на подмодуль.

9
ответ дан Peter Mortensen 22 August 2018 в 03:51
поделиться
  • 1
    Я тоже должен был сделать это, чтобы пройти мимо «фатального»: не репозиторий git: & quot; при попытке выполнить шаг git rm --cache. – RickDT 1 April 2013 в 16:48

Просто примечание. Начиная с git 1.8.5.2, будут выполняться две команды:

git rm the_submodule
rm -rf .git/modules/the_submodule

Как правильно указал ответ @Mark Cheverton, если вторая строка не используется, даже если вы удалили подмодуль на данный момент, остатки .git / modules / the_submodule предотвратит добавление или замену того же субмодуля в будущем. Кроме того, как упоминалось в @VonC, git rm выполнит большую часть задания на подмодуле.

- Обновление (07/05/2017) -

Чтобы уточнить, the_submodule - относительный путь подмодуля внутри проекта. Например, это subdir/my_submodule, если подмодуль находится внутри подкаталога subdir.

Как указано в комментариях и других ответах , две команды (хотя и функционально достаточны для удаления подмодуля), оставьте след в секции [submodule "the_submodule"] в .git/config (по состоянию на июль 2017 года), который можно удалить с помощью третьей команды:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
338
ответ дан tinlyx 22 August 2018 в 03:51
поделиться
  • 1
    Я на git версии 2.4.9 (Apple Git-60), и все, что мне нужно было сделать, это rm the_submodule. Я нажал на него, а затем снова добавил папку с именем так же, как и подмодуль, и он работал без проблем. – David Silva Smith 3 December 2015 в 22:23
  • 2
    Это не удаляет запись подмодуля из .git/config. См. stackoverflow.com/a/36593218/1562138 для полного способа удаления подмодуля. – fvgs 13 April 2016 в 08:53
  • 3
    Это на 100% абсолютно блестящий и работает. Вау. – Dan Rosenstark 20 April 2016 в 14:12
  • 4
    @drevicko Я только что проверил это с Git 2.11.1, и я наблюдаю то же поведение, что и раньше. git init && git submodule add <repository> && git rm <name> оставляет запись .git/config и директорию .git/modules/<name> и ее содержимое. Возможно, вы не инициализировали подмодуль до его удаления? – fvgs 22 February 2017 в 17:58
  • 5
    я чувствую себя более безопасным, запуская этот первый. git subodule deinit -f the_submodule – danday74 10 March 2017 в 05:22

После экспериментов со всеми различными ответами на этом сайте я закончил это решение:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

Это восстанавливает то же самое состояние, что и до добавления подмодуля. Вы можете сразу добавить субмодуль снова, что было невозможно в большинстве ответов здесь.

git submodule add $giturl test
aboveScript test

Это оставляет вас с чистой проверкой без изменений фиксации.

Это было проверено с помощью:

$ git --version
git version 1.9.3 (Apple Git-50)
20
ответ дан udondan 22 August 2018 в 03:51
поделиться
  • 1
    Почему вы используете git rm --cached $path, а затем rm -rf $path вместо git rm -r $path? – bfontaine 29 November 2014 в 16:00
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force
6
ответ дан user 22 August 2018 в 03:51
поделиться
81
ответ дан GAMITG 5 November 2018 в 03:04
поделиться