Created
April 28, 2020 19:40
-
-
Save RobertEves92/a805571b082de81198ea671c2e55d971 to your computer and use it in GitHub Desktop.
Replace text using BFG
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
How to replace text everywhere in Git | |
There is a Git command, filter-branch, which works wonders for changing the history of a repository, but it’s difficult to use because it forces you to know how Git works under the hood. Instead there is this little free tool, BFG Repo-Cleaner, which is intuitive, fast and recommended. | |
Check that there are some occurrences of your string | |
The first thing to do is to check that the repository contains the string you want to replace with another string. This will help later to make sure you effectively replaced it. | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ git clone [email protected]:aercolino/your-repository.git | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ cd your-repository | |
andrea at Lock-and-Stock in ~/dev/ruby/your-repository | |
$ git log -G"your string" -i --all | |
commit ... | |
Author: ... | |
Date: ... | |
Message 2 | |
commit ... | |
Author: ... | |
Date: ... | |
Message 1 | |
Notice that, on the above git log line, the -G option allows to specify a regular expression, and the -i option allows to ignore case. | |
Install BFG | |
BFG needs a JVM and you can install one with brew on a Mac. | |
$ brew cask install java | |
$ brew install bfg | |
Create search-replace.txt | |
BFG takes a file for specifying the text to search and replace. The accepted format is one replacement per line, like SEARCH==>REPLACE, with optional prefixes regex:, and glob:. | |
regex:your string==>another string | |
Use BFG | |
BFG acts on a bare repository which you can get by cloning with the --mirror option. Make sure the last commit doesn’t contains the text to be replaced, otherwise add a clean commit and push it before cloning. | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ git clone --mirror [email protected]:aercolino/your-repository.git | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ bfg --replace-text search-replace.txt your-repository.git | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ cd your-repository.git | |
andrea at Lock-and-Stock in ~/dev/ruby/your-repository.git | |
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive | |
Backup the old your-repository | |
You can recover this backup analogously to the section below. | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ git clone --mirror [email protected]:aercolino/blog-experiment.git blog-experiment.git.backup | |
Create a new your-repository | |
This step involves removing your remote old repository and creating a remote new one with the same name as before. Then you can push to it from your local repository using the --mirror option. | |
andrea at Lock-and-Stock in ~/dev/ruby/your-repository.git | |
$ git push origin --mirror | |
Check that your string was replaced by another string | |
If all is OK then you should see no results when searching again for your string but at least the same number of results you got when looking for it before if you now look for the replacement string. | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ git clone [email protected]:aercolino/your-repository.git | |
andrea at Lock-and-Stock in ~/dev/ruby | |
$ cd your-repository | |
andrea at Lock-and-Stock in ~/dev/ruby/your-repository | |
$ git log -G"your string" -i --all | |
(nothing shown) | |
andrea at Lock-and-Stock in ~/dev/ruby/your-repository | |
$ git log -G"another string" -i --all | |
commit ... | |
Author: ... | |
Date: ... | |
Message 2 | |
commit ... | |
Author: ... | |
Date: ... | |
Message 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment