bind()
. 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));
function MyConstructor(data, transport) {
var self = this;
this.data = data;
transport.on('data', function() {
alert(self.data);
});
}
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', () => {
alert(this.data);
});
}
Поскольку 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} "$@"
На странице Учебник по субмодулю Git :
Чтобы удалить подмодуль, вам необходимо:
.gitmodules
. .gitmodules
git add .gitmodules
.git/config
. git rm --cached path_to_submodule
(нет конечной косой черты). rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
См. также: альтернативные шаги ниже .
git submodule rm
просто удаляет регистрацию подмодулей и будет удивлен, если команда также удалит локальный репозиторий. Любые локальные изменения будут безвозвратно потеряны. И, возможно, другой человек подумает, что только файлы будут удалены.
– John Douthat
21 January 2011 в 02:50
Простые шаги
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
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? .
for dir in directory/*; do git rm --cached $dir; done
.
– Pablo Olmos de Aguilera C.
9 October 2011 в 21:50
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
git submodule | grep '^+' | cut -d' ' -f2
– errordeveloper
12 October 2011 в 02:01
submodulename
в двойные кавычки "submodulename"
.. ссылаясь на файл .git/config
– muon
20 July 2017 в 15:22
Если вы только что добавили подмодуль, и, например, вы просто добавили неправильный субмодуль или добавили его в неправильное место, просто сделайте git stash
, затем удалите папку. Это предполагает, что добавление подмодуля - единственное, что вы сделали в недавнем репо.
Вы должны удалить запись в .gitmodules
и .git/config
и удалить каталог из истории из истории:
git rm --cached path/to/submodule
Если вы напишете список рассылки git, возможно, кто-то будет сделайте для вас сценарий оболочки.
Вы можете использовать псевдоним для автоматизации решений, предоставляемых другими:
[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
Я нашел, что deinit
работает хорошо для меня:
git submodule deinit <submodule-name>
git rm <submodule-name>
Из git docs :
deinit
Отменить регистрацию данных подмодулей, т. е. удалить весь раздел
submodule.$name
из .git / config вместе с их деревом работы.
Чтобы удалить добавленный подмодуль, используя:
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
git rm
все еще оставляет материал в .git/modules/
. (2.5.4)
– Rudolf Adamkovič
2 January 2016 в 15:40
git rm
, это не так; Быстрый тест с 2.5.4 на моем mac обновляет файл .gitmodules, как описано в документации: git-scm.com/docs/git-rm#_submodules ... но если у вас есть нашел какую-то комбинацию платформы / версии, где этого не происходит, вам, вероятно, следует добавить ошибку.
– Doug
2 January 2016 в 16:48
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
rm -rf
просто означает "удалить всю папку" поэтому вы можете сделать это из графического интерфейса Explorer в Windows. Кроме того, если вы используете git в Windows, у вас также будет доступ к git bash, поэтому вы можете запускать все эти команды там, и они будут работать так, как они есть
– Andy Madge
8 December 2017 в 12:24
Я только что нашел скрытый файл .submodule (забыли точное имя), у него есть список ... вы можете стереть их индивидуально таким образом. У меня только один, поэтому я удалил его. Просто, но это может испортить Гит, так как я не знаю, прикреплено ли что-то к подмодулю. Кажется, все хорошо, кроме обычной проблемы обновления libetpan, но это (надеюсь) не связано.
Заметили, что никто не опубликовал ручное стирание, поэтому добавил
git submodule update
. И если пути подмодулей не были обновлены правильно (git выдает ошибку), удалите их: rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
– luissquall
29 April 2015 в 00:22
fatal: no submodule mapping found in .gitmodules for path 'submodule_name'
на шаге 3. Однако оба шага были необходимы. (git v2.8.2)
– U007D
25 August 2016 в 00:16
То, что я сейчас делаю 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}"
Вот 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.
Я должен был выполнить шаги Джона Дютута еще на один шаг и cd
в каталог подмодуля, а затем удалить репозиторий Git:
cd submodule
rm -fr .git
Тогда я мог бы зафиксировать файлы как часть родительский репозиторий Git без старой ссылки на подмодуль.
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
.git/config
. См. stackoverflow.com/a/36593218/1562138 для полного способа удаления подмодуля.
– fvgs
13 April 2016 в 08:53
git init && git submodule add <repository> && git rm <name>
оставляет запись .git/config
и директорию .git/modules/<name>
и ее содержимое. Возможно, вы не инициализировали подмодуль до его удаления?
– fvgs
22 February 2017 в 17:58
После экспериментов со всеми различными ответами на этом сайте я закончил это решение:
#!/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)
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
submodule deinit
? – zakdances 28 April 2013 в 19:42.gitmodules
должен быть в порядке, но я бы все же дважды проверил что-либо с каталогом.git
(т.е. local i> config, в вашем локальном репо: это не изменяется с помощьюgit pull
) – VonC 4 June 2013 в 16:40.gitmodules
и удаление специальной записи в индексе и нажмите это репо, другие могут потянуть ее, и этот подмодуль исчезнет. – VonC 2 August 2013 в 07:04PATH
иgit remove-submodule path/to/submodule
. – Adam Sharp 21 August 2013 в 03:26