Make sure the log file is actually growing.
Find out _why_ it's still growing.
SELECT name, log_reuse_wait, log_reuse_wait_desc
ORDER BY name
Our result was ACTIVE TRANSACTION. This could be either a transaction, or replication.
Why does this matter?
If the oldest transaction is still open, everything since then has to go in a new part of the data file - think of it like something blocking the entry to your cube. It doesn't have to be big, there's plenty of room inside the cube, but you need to get rid of the item to get in.
Fortunately, finding the errand SPID is easy.
DBCC OPENTRAN (
It gives you the SPID of the errant process. In our case, it was a user process people had forgotten about. Kill the spid (or get the person to stop it) and rerun your free-space-within-database again.
There are other ways to find the open transactions.
SELECT * FROM sys.dm_tran_session_transactions
, but that's a bit more vague. It'll give you the SPID (session_id) of all open transactions, but for what I was doing it didn't seem to give me the SPID I needed to kill. You could also select from sys.processes, but honestly OPENTRAN is simpler.